ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Convert-BER-XS/XS.xs
(Generate patch)

Comparing Convert-BER-XS/XS.xs (file contents):
Revision 1.3 by root, Fri Apr 19 19:46:29 2019 UTC vs.
Revision 1.4 by root, Fri Apr 19 20:38:38 2019 UTC

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 *
662static AV *
663ber_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
661static void 679static void
662encode_ber (SV *tuple) 680encode_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
801void 810void
802ber_is (SV *tuple, SV *klass = &PL_sv_undef, SV *tag = &PL_sv_undef, SV *constructed = &PL_sv_undef, SV *data = &PL_sv_undef) 811ber_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
822void 830void
823ber_is_seq (SV *tuple) 831ber_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
841void 846void
842ber_is_i32 (SV *tuple, IV value) 847ber_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
861void 866void
862ber_is_oid (SV *tuple, SV *oid) 867ber_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
883void 885void
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
899SV *
900ber_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?
914SV *
915ber_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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines