… | |
… | |
656 | } |
656 | } |
657 | |
657 | |
658 | len_fixup (mark); |
658 | len_fixup (mark); |
659 | } |
659 | } |
660 | |
660 | |
|
|
661 | // checkl whether an SV is a BER tuple and returns its AV * |
|
|
662 | static AV * |
|
|
663 | ber_tuple (SV *tuple) |
|
|
664 | { |
|
|
665 | SV *rv; |
|
|
666 | |
|
|
667 | if (expect_false (!SvROK (tuple) || SvTYPE ((rv = SvRV (tuple))) != SVt_PVAV)) |
|
|
668 | croak ("BER tuple must be array-reference"); |
|
|
669 | |
|
|
670 | if (expect_false (SvRMAGICAL (rv))) |
|
|
671 | croak ("BER tuple must not be tied"); |
|
|
672 | |
|
|
673 | if (expect_false (AvFILL ((AV *)rv) != BER_ARRAYSIZE - 1)) |
|
|
674 | croak ("BER tuple must contain exactly %d elements, not %d", BER_ARRAYSIZE, AvFILL ((AV *)rv) + 1); |
|
|
675 | |
|
|
676 | return (AV *)rv; |
|
|
677 | } |
|
|
678 | |
661 | static void |
679 | static void |
662 | encode_ber (SV *tuple) |
680 | encode_ber (SV *tuple) |
663 | { |
681 | { |
664 | if (expect_false (!SvROK (tuple) || SvTYPE (SvRV (tuple)) != SVt_PVAV)) |
682 | AV *av = ber_tuple (tuple); |
665 | croak ("BER tuple must be array-reference"); |
|
|
666 | |
|
|
667 | AV *av = (AV *)SvRV (tuple); |
|
|
668 | |
|
|
669 | if (expect_false (SvRMAGICAL (av))) |
|
|
670 | croak ("BER tuple must not be tied"); |
|
|
671 | |
|
|
672 | if (expect_false (AvFILL (av) != BER_ARRAYSIZE - 1)) |
|
|
673 | croak ("BER tuple must contain exactly %d elements, not %d", BER_ARRAYSIZE, AvFILL (av) + 1); |
|
|
674 | |
683 | |
675 | int klass = SvIV (AvARRAY (av)[BER_CLASS]); |
684 | int klass = SvIV (AvARRAY (av)[BER_CLASS]); |
676 | int tag = SvIV (AvARRAY (av)[BER_TAG]); |
685 | int tag = SvIV (AvARRAY (av)[BER_TAG]); |
677 | int constructed = SvIV (AvARRAY (av)[BER_CONSTRUCTED]) ? ASN_CONSTRUCTED : 0; |
686 | int constructed = SvIV (AvARRAY (av)[BER_CONSTRUCTED]) ? ASN_CONSTRUCTED : 0; |
678 | SV *data = AvARRAY (av)[BER_DATA]; |
687 | SV *data = AvARRAY (av)[BER_DATA]; |
… | |
… | |
798 | } |
807 | } |
799 | OUTPUT: RETVAL |
808 | OUTPUT: RETVAL |
800 | |
809 | |
801 | void |
810 | void |
802 | ber_is (SV *tuple, SV *klass = &PL_sv_undef, SV *tag = &PL_sv_undef, SV *constructed = &PL_sv_undef, SV *data = &PL_sv_undef) |
811 | ber_is (SV *tuple, SV *klass = &PL_sv_undef, SV *tag = &PL_sv_undef, SV *constructed = &PL_sv_undef, SV *data = &PL_sv_undef) |
803 | PROTOTYPE: $;$$$ |
|
|
804 | PPCODE: |
812 | PPCODE: |
805 | { |
813 | { |
806 | if (!SvOK (tuple)) |
814 | if (!SvOK (tuple)) |
807 | XSRETURN_NO; |
815 | XSRETURN_NO; |
808 | |
816 | |
809 | if (!SvROK (tuple) || SvTYPE (SvRV (tuple)) != SVt_PVAV) |
817 | if (!SvROK (tuple) || SvTYPE (SvRV (tuple)) != SVt_PVAV) |
810 | croak ("ber_seq: tuple must be ber tuple (array-ref)"); |
818 | croak ("ber_is: tuple must be BER tuple (array-ref)"); |
811 | |
819 | |
812 | AV *av = (AV *)SvRV (tuple); |
820 | AV *av = (AV *)SvRV (tuple); |
813 | |
821 | |
814 | XPUSHs ( |
822 | XPUSHs ( |
815 | (!SvOK (klass) || SvIV (AvARRAY (av)[BER_CLASS ]) == SvIV (klass)) |
823 | (!SvOK (klass) || SvIV (AvARRAY (av)[BER_CLASS ]) == SvIV (klass)) |
816 | && (!SvOK (tag) || SvIV (AvARRAY (av)[BER_TAG ]) == SvIV (tag)) |
824 | && (!SvOK (tag) || SvIV (AvARRAY (av)[BER_TAG ]) == SvIV (tag)) |
817 | && (!SvOK (constructed) || !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) == !SvIV (constructed)) |
825 | && (!SvOK (constructed) || !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) == !SvIV (constructed)) |
818 | && (!SvOK (data) || sv_eq (AvARRAY (av)[BER_DATA ], data)) |
826 | && (!SvOK (data) || sv_eq (AvARRAY (av)[BER_DATA ], data)) |
819 | ? &PL_sv_yes : &PL_sv_no); |
827 | ? &PL_sv_yes : &PL_sv_undef); |
820 | } |
828 | } |
821 | |
829 | |
822 | void |
830 | void |
823 | ber_is_seq (SV *tuple) |
831 | ber_is_seq (SV *tuple) |
824 | PPCODE: |
832 | PPCODE: |
825 | { |
833 | { |
826 | if (!SvOK (tuple)) |
834 | if (!SvOK (tuple)) |
827 | XSRETURN_UNDEF; |
835 | XSRETURN_UNDEF; |
828 | |
836 | |
829 | if (!SvROK (tuple) || SvTYPE (SvRV (tuple)) != SVt_PVAV) |
837 | AV *av = ber_tuple (tuple); |
830 | croak ("ber_seq: tuple must be ber tuple (array-ref)"); |
|
|
831 | |
|
|
832 | AV *av = (AV *)SvRV (tuple); |
|
|
833 | |
838 | |
834 | XPUSHs ( |
839 | XPUSHs ( |
835 | SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL |
840 | SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL |
836 | && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_SEQUENCE |
841 | && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_SEQUENCE |
837 | && SvIV (AvARRAY (av)[BER_CONSTRUCTED]) |
842 | && SvIV (AvARRAY (av)[BER_CONSTRUCTED]) |
838 | ? AvARRAY (av)[BER_DATA] : &PL_sv_undef); |
843 | ? AvARRAY (av)[BER_DATA] : &PL_sv_undef); |
839 | } |
844 | } |
840 | |
845 | |
841 | void |
846 | void |
842 | ber_is_i32 (SV *tuple, IV value) |
847 | ber_is_i32 (SV *tuple, SV *value = &PL_sv_undef) |
843 | PPCODE: |
848 | PPCODE: |
844 | { |
849 | { |
845 | if (!SvOK (tuple)) |
850 | if (!SvOK (tuple)) |
846 | XSRETURN_NO; |
851 | XSRETURN_NO; |
847 | |
852 | |
848 | if (!SvROK (tuple) || SvTYPE (SvRV (tuple)) != SVt_PVAV) |
853 | AV *av = ber_tuple (tuple); |
849 | croak ("ber_seq: tuple must be ber tuple (array-ref)"); |
|
|
850 | |
854 | |
851 | AV *av = (AV *)SvRV (tuple); |
855 | IV data = SvIV (AvARRAY (av)[BER_DATA]); |
852 | |
856 | |
853 | XPUSHs ( |
857 | XPUSHs ( |
854 | SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL |
858 | SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL |
855 | && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_INTEGER32 |
859 | && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_INTEGER32 |
856 | && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) |
860 | && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) |
857 | && SvIV (AvARRAY (av)[BER_DATA ]) == value |
861 | && (!SvOK (value) || data == SvIV (value)) |
858 | ? &PL_sv_yes : &PL_sv_no); |
862 | ? sv_2mortal (data ? newSViv (data) : newSVpv ("0 but true", 0)) |
|
|
863 | : &PL_sv_undef); |
859 | } |
864 | } |
860 | |
865 | |
861 | void |
866 | void |
862 | ber_is_oid (SV *tuple, SV *oid) |
867 | ber_is_oid (SV *tuple, SV *oid = &PL_sv_undef) |
863 | PPCODE: |
868 | PPCODE: |
864 | { |
869 | { |
865 | if (!SvOK (tuple)) |
870 | if (!SvOK (tuple)) |
866 | XSRETURN_NO; |
871 | XSRETURN_NO; |
867 | |
872 | |
868 | if (!SvROK (tuple) || SvTYPE (SvRV (tuple)) != SVt_PVAV) |
873 | AV *av = ber_tuple (tuple); |
869 | croak ("ber_seq: tuple must be ber tuple (array-ref)"); |
|
|
870 | |
|
|
871 | AV *av = (AV *)SvRV (tuple); |
|
|
872 | |
874 | |
873 | XPUSHs ( |
875 | XPUSHs ( |
874 | SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL |
876 | SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL |
875 | && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_OBJECT_IDENTIFIER |
877 | && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_OBJECT_IDENTIFIER |
876 | && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) |
878 | && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) |
877 | && sv_eq (AvARRAY (av)[BER_DATA], oid) |
879 | && (!SvOK (oid) || sv_eq (AvARRAY (av)[BER_DATA], oid)) |
878 | ? &PL_sv_yes : &PL_sv_no); |
880 | ? newSVsv (AvARRAY (av)[BER_DATA]) : &PL_sv_undef); |
879 | } |
881 | } |
880 | |
882 | |
881 | ############################################################################# |
883 | ############################################################################# |
882 | |
884 | |
883 | void |
885 | void |
… | |
… | |
892 | |
894 | |
893 | SvCUR_set (buf_sv, cur - buf); |
895 | SvCUR_set (buf_sv, cur - buf); |
894 | XPUSHs (buf_sv); |
896 | XPUSHs (buf_sv); |
895 | } |
897 | } |
896 | |
898 | |
|
|
899 | SV * |
|
|
900 | ber_i32 (IV iv) |
|
|
901 | CODE: |
|
|
902 | { |
|
|
903 | AV *av = newAV (); |
|
|
904 | av_fill (av, BER_ARRAYSIZE - 1); |
|
|
905 | AvARRAY (av)[BER_CLASS ] = newSVcacheint (ASN_UNIVERSAL); |
|
|
906 | AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_INTEGER32); |
|
|
907 | AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (0); |
|
|
908 | AvARRAY (av)[BER_DATA ] = newSViv (iv); |
|
|
909 | RETVAL = newRV_noinc ((SV *)av); |
|
|
910 | } |
|
|
911 | OUTPUT: RETVAL |
|
|
912 | |
|
|
913 | # TODO: not arrayref, but elements? |
|
|
914 | SV * |
|
|
915 | ber_seq (SV *arrayref) |
|
|
916 | CODE: |
|
|
917 | { |
|
|
918 | AV *av = newAV (); |
|
|
919 | av_fill (av, BER_ARRAYSIZE - 1); |
|
|
920 | AvARRAY (av)[BER_CLASS ] = newSVcacheint (ASN_UNIVERSAL); |
|
|
921 | AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_SEQUENCE); |
|
|
922 | AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (1); |
|
|
923 | AvARRAY (av)[BER_DATA ] = newSVsv (arrayref); |
|
|
924 | RETVAL = newRV_noinc ((SV *)av); |
|
|
925 | } |
|
|
926 | OUTPUT: RETVAL |
|
|
927 | |