--- Convert-BER-XS/XS.xs 2019/04/20 15:23:26 1.15 +++ Convert-BER-XS/XS.xs 2019/04/20 15:37:27 1.16 @@ -82,10 +82,10 @@ }; enum { - BER_CLASS = 0, - BER_TAG = 1, - BER_CONSTRUCTED = 2, - BER_DATA = 3, + BER_CLASS = 0, + BER_TAG = 1, + BER_FLAGS = 2, + BER_DATA = 3, BER_ARRAYSIZE }; @@ -550,10 +550,10 @@ AV *av = newAV (); av_fill (av, BER_ARRAYSIZE - 1); - AvARRAY (av)[BER_CLASS ] = newSVcacheint (klass); - AvARRAY (av)[BER_TAG ] = newSVcacheint (tag); - AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (constructed ? 1 : 0); - AvARRAY (av)[BER_DATA ] = res; + AvARRAY (av)[BER_CLASS] = newSVcacheint (klass); + AvARRAY (av)[BER_TAG ] = newSVcacheint (tag); + AvARRAY (av)[BER_FLAGS] = newSVcacheint (constructed ? 1 : 0); + AvARRAY (av)[BER_DATA ] = res; return newRV_noinc ((SV *)av); } @@ -883,7 +883,7 @@ int klass = SvIV (AvARRAY (av)[BER_CLASS]); int tag = SvIV (AvARRAY (av)[BER_TAG]); - int constructed = SvIV (AvARRAY (av)[BER_CONSTRUCTED]) ? ASN_CONSTRUCTED : 0; + int constructed = SvIV (AvARRAY (av)[BER_FLAGS]) & 1 ? ASN_CONSTRUCTED : 0; SV *data = AvARRAY (av)[BER_DATA]; int identifier = (klass << ASN_CLASS_SHIFT) | constructed; @@ -1039,7 +1039,7 @@ const_iv (BER_CLASS) const_iv (BER_TAG) - const_iv (BER_CONSTRUCTED) + const_iv (BER_FLAGS) const_iv (BER_DATA) const_iv (BER_TYPE_BYTES) @@ -1082,7 +1082,7 @@ OUTPUT: RETVAL void -ber_is (SV *tuple, SV *klass = &PL_sv_undef, SV *tag = &PL_sv_undef, SV *constructed = &PL_sv_undef, SV *data = &PL_sv_undef) +ber_is (SV *tuple, SV *klass = &PL_sv_undef, SV *tag = &PL_sv_undef, SV *flags = &PL_sv_undef, SV *data = &PL_sv_undef) PPCODE: { if (!SvOK (tuple)) @@ -1094,10 +1094,10 @@ AV *av = (AV *)SvRV (tuple); XPUSHs ( - (!SvOK (klass) || SvIV (AvARRAY (av)[BER_CLASS ]) == SvIV (klass)) - && (!SvOK (tag) || SvIV (AvARRAY (av)[BER_TAG ]) == SvIV (tag)) - && (!SvOK (constructed) || !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) == !SvIV (constructed)) - && (!SvOK (data) || sv_eq (AvARRAY (av)[BER_DATA ], data)) + (!SvOK (klass) || SvIV (AvARRAY (av)[BER_CLASS]) == SvIV (klass)) + && (!SvOK (tag) || SvIV (AvARRAY (av)[BER_TAG ]) == SvIV (tag)) + && (!SvOK (flags) || !SvIV (AvARRAY (av)[BER_FLAGS]) == !SvIV (flags)) + && (!SvOK (data) || sv_eq (AvARRAY (av)[BER_DATA ], data)) ? &PL_sv_yes : &PL_sv_undef); } @@ -1111,9 +1111,9 @@ AV *av = ber_tuple (tuple); XPUSHs ( - SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL - && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_SEQUENCE - && SvIV (AvARRAY (av)[BER_CONSTRUCTED]) + SvIV (AvARRAY (av)[BER_CLASS]) == ASN_UNIVERSAL + && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_SEQUENCE + && SvIV (AvARRAY (av)[BER_FLAGS]) ? AvARRAY (av)[BER_DATA] : &PL_sv_undef); } @@ -1129,9 +1129,9 @@ UV data = SvUV (AvARRAY (av)[BER_DATA]); XPUSHs ( - SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL - && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_INTEGER - && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) + SvIV (AvARRAY (av)[BER_CLASS]) == ASN_UNIVERSAL + && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_INTEGER + && !SvIV (AvARRAY (av)[BER_FLAGS]) && (!SvOK (value) || data == SvUV (value)) ? sv_2mortal (data ? newSVsv (AvARRAY (av)[BER_DATA]) : newSVpv ("0 but true", 0)) : &PL_sv_undef); @@ -1147,9 +1147,9 @@ AV *av = ber_tuple (tuple); XPUSHs ( - SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL - && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_OBJECT_IDENTIFIER - && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) + SvIV (AvARRAY (av)[BER_CLASS]) == ASN_UNIVERSAL + && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_OBJECT_IDENTIFIER + && !SvIV (AvARRAY (av)[BER_FLAGS]) && (!SvOK (oid) || sv_eq (AvARRAY (av)[BER_DATA], oid)) ? newSVsv (AvARRAY (av)[BER_DATA]) : &PL_sv_undef); } @@ -1177,10 +1177,10 @@ { AV *av = newAV (); av_fill (av, BER_ARRAYSIZE - 1); - AvARRAY (av)[BER_CLASS ] = newSVcacheint (ASN_UNIVERSAL); - AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_INTEGER); - AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (0); - AvARRAY (av)[BER_DATA ] = newSVsv (sv); + AvARRAY (av)[BER_CLASS] = newSVcacheint (ASN_UNIVERSAL); + AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_INTEGER); + AvARRAY (av)[BER_FLAGS] = newSVcacheint (0); + AvARRAY (av)[BER_DATA ] = newSVsv (sv); RETVAL = newRV_noinc ((SV *)av); } OUTPUT: RETVAL @@ -1192,10 +1192,10 @@ { AV *av = newAV (); av_fill (av, BER_ARRAYSIZE - 1); - AvARRAY (av)[BER_CLASS ] = newSVcacheint (ASN_UNIVERSAL); - AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_SEQUENCE); - AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (1); - AvARRAY (av)[BER_DATA ] = newSVsv (arrayref); + AvARRAY (av)[BER_CLASS] = newSVcacheint (ASN_UNIVERSAL); + AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_SEQUENCE); + AvARRAY (av)[BER_FLAGS] = newSVcacheint (1); + AvARRAY (av)[BER_DATA ] = newSVsv (arrayref); RETVAL = newRV_noinc ((SV *)av); } OUTPUT: RETVAL