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.15 by root, Sat Apr 20 15:23:26 2019 UTC vs.
Revision 1.16 by root, Sat Apr 20 15:37:27 2019 UTC

80 BER_TYPE_IPADDRESS, 80 BER_TYPE_IPADDRESS,
81 BER_TYPE_CROAK, 81 BER_TYPE_CROAK,
82}; 82};
83 83
84enum { 84enum {
85 BER_CLASS = 0, 85 BER_CLASS = 0,
86 BER_TAG = 1, 86 BER_TAG = 1,
87 BER_CONSTRUCTED = 2, 87 BER_FLAGS = 2,
88 BER_DATA = 3, 88 BER_DATA = 3,
89 BER_ARRAYSIZE 89 BER_ARRAYSIZE
90}; 90};
91 91
92#define MAX_OID_STRLEN 4096 92#define MAX_OID_STRLEN 4096
93 93
548 croak ("unconfigured/unsupported class/tag %d/%d", klass, tag); 548 croak ("unconfigured/unsupported class/tag %d/%d", klass, tag);
549 } 549 }
550 550
551 AV *av = newAV (); 551 AV *av = newAV ();
552 av_fill (av, BER_ARRAYSIZE - 1); 552 av_fill (av, BER_ARRAYSIZE - 1);
553 AvARRAY (av)[BER_CLASS ] = newSVcacheint (klass); 553 AvARRAY (av)[BER_CLASS] = newSVcacheint (klass);
554 AvARRAY (av)[BER_TAG ] = newSVcacheint (tag); 554 AvARRAY (av)[BER_TAG ] = newSVcacheint (tag);
555 AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (constructed ? 1 : 0); 555 AvARRAY (av)[BER_FLAGS] = newSVcacheint (constructed ? 1 : 0);
556 AvARRAY (av)[BER_DATA ] = res; 556 AvARRAY (av)[BER_DATA ] = res;
557 557
558 return newRV_noinc ((SV *)av); 558 return newRV_noinc ((SV *)av);
559} 559}
560 560
561///////////////////////////////////////////////////////////////////////////// 561/////////////////////////////////////////////////////////////////////////////
881{ 881{
882 AV *av = ber_tuple (tuple); 882 AV *av = ber_tuple (tuple);
883 883
884 int klass = SvIV (AvARRAY (av)[BER_CLASS]); 884 int klass = SvIV (AvARRAY (av)[BER_CLASS]);
885 int tag = SvIV (AvARRAY (av)[BER_TAG]); 885 int tag = SvIV (AvARRAY (av)[BER_TAG]);
886 int constructed = SvIV (AvARRAY (av)[BER_CONSTRUCTED]) ? ASN_CONSTRUCTED : 0; 886 int constructed = SvIV (AvARRAY (av)[BER_FLAGS]) & 1 ? ASN_CONSTRUCTED : 0;
887 SV *data = AvARRAY (av)[BER_DATA]; 887 SV *data = AvARRAY (av)[BER_DATA];
888 888
889 int identifier = (klass << ASN_CLASS_SHIFT) | constructed; 889 int identifier = (klass << ASN_CLASS_SHIFT) | constructed;
890 890
891 if (expect_false (tag >= ASN_TAG_BER)) 891 if (expect_false (tag >= ASN_TAG_BER))
1037 const_iv (ASN_CONTEXT) 1037 const_iv (ASN_CONTEXT)
1038 const_iv (ASN_PRIVATE) 1038 const_iv (ASN_PRIVATE)
1039 1039
1040 const_iv (BER_CLASS) 1040 const_iv (BER_CLASS)
1041 const_iv (BER_TAG) 1041 const_iv (BER_TAG)
1042 const_iv (BER_CONSTRUCTED) 1042 const_iv (BER_FLAGS)
1043 const_iv (BER_DATA) 1043 const_iv (BER_DATA)
1044 1044
1045 const_iv (BER_TYPE_BYTES) 1045 const_iv (BER_TYPE_BYTES)
1046 const_iv (BER_TYPE_UTF8) 1046 const_iv (BER_TYPE_UTF8)
1047 const_iv (BER_TYPE_UCS2) 1047 const_iv (BER_TYPE_UCS2)
1080 RETVAL = decode_ber (); 1080 RETVAL = decode_ber ();
1081} 1081}
1082 OUTPUT: RETVAL 1082 OUTPUT: RETVAL
1083 1083
1084void 1084void
1085ber_is (SV *tuple, SV *klass = &PL_sv_undef, SV *tag = &PL_sv_undef, SV *constructed = &PL_sv_undef, SV *data = &PL_sv_undef) 1085ber_is (SV *tuple, SV *klass = &PL_sv_undef, SV *tag = &PL_sv_undef, SV *flags = &PL_sv_undef, SV *data = &PL_sv_undef)
1086 PPCODE: 1086 PPCODE:
1087{ 1087{
1088 if (!SvOK (tuple)) 1088 if (!SvOK (tuple))
1089 XSRETURN_NO; 1089 XSRETURN_NO;
1090 1090
1092 croak ("ber_is: tuple must be BER tuple (array-ref)"); 1092 croak ("ber_is: tuple must be BER tuple (array-ref)");
1093 1093
1094 AV *av = (AV *)SvRV (tuple); 1094 AV *av = (AV *)SvRV (tuple);
1095 1095
1096 XPUSHs ( 1096 XPUSHs (
1097 (!SvOK (klass) || SvIV (AvARRAY (av)[BER_CLASS ]) == SvIV (klass)) 1097 (!SvOK (klass) || SvIV (AvARRAY (av)[BER_CLASS]) == SvIV (klass))
1098 && (!SvOK (tag) || SvIV (AvARRAY (av)[BER_TAG ]) == SvIV (tag)) 1098 && (!SvOK (tag) || SvIV (AvARRAY (av)[BER_TAG ]) == SvIV (tag))
1099 && (!SvOK (constructed) || !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) == !SvIV (constructed)) 1099 && (!SvOK (flags) || !SvIV (AvARRAY (av)[BER_FLAGS]) == !SvIV (flags))
1100 && (!SvOK (data) || sv_eq (AvARRAY (av)[BER_DATA ], data)) 1100 && (!SvOK (data) || sv_eq (AvARRAY (av)[BER_DATA ], data))
1101 ? &PL_sv_yes : &PL_sv_undef); 1101 ? &PL_sv_yes : &PL_sv_undef);
1102} 1102}
1103 1103
1104void 1104void
1105ber_is_seq (SV *tuple) 1105ber_is_seq (SV *tuple)
1109 XSRETURN_UNDEF; 1109 XSRETURN_UNDEF;
1110 1110
1111 AV *av = ber_tuple (tuple); 1111 AV *av = ber_tuple (tuple);
1112 1112
1113 XPUSHs ( 1113 XPUSHs (
1114 SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL 1114 SvIV (AvARRAY (av)[BER_CLASS]) == ASN_UNIVERSAL
1115 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_SEQUENCE 1115 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_SEQUENCE
1116 && SvIV (AvARRAY (av)[BER_CONSTRUCTED]) 1116 && SvIV (AvARRAY (av)[BER_FLAGS])
1117 ? AvARRAY (av)[BER_DATA] : &PL_sv_undef); 1117 ? AvARRAY (av)[BER_DATA] : &PL_sv_undef);
1118} 1118}
1119 1119
1120void 1120void
1121ber_is_int (SV *tuple, SV *value = &PL_sv_undef) 1121ber_is_int (SV *tuple, SV *value = &PL_sv_undef)
1127 AV *av = ber_tuple (tuple); 1127 AV *av = ber_tuple (tuple);
1128 1128
1129 UV data = SvUV (AvARRAY (av)[BER_DATA]); 1129 UV data = SvUV (AvARRAY (av)[BER_DATA]);
1130 1130
1131 XPUSHs ( 1131 XPUSHs (
1132 SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL 1132 SvIV (AvARRAY (av)[BER_CLASS]) == ASN_UNIVERSAL
1133 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_INTEGER 1133 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_INTEGER
1134 && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) 1134 && !SvIV (AvARRAY (av)[BER_FLAGS])
1135 && (!SvOK (value) || data == SvUV (value)) 1135 && (!SvOK (value) || data == SvUV (value))
1136 ? sv_2mortal (data ? newSVsv (AvARRAY (av)[BER_DATA]) : newSVpv ("0 but true", 0)) 1136 ? sv_2mortal (data ? newSVsv (AvARRAY (av)[BER_DATA]) : newSVpv ("0 but true", 0))
1137 : &PL_sv_undef); 1137 : &PL_sv_undef);
1138} 1138}
1139 1139
1145 XSRETURN_NO; 1145 XSRETURN_NO;
1146 1146
1147 AV *av = ber_tuple (tuple); 1147 AV *av = ber_tuple (tuple);
1148 1148
1149 XPUSHs ( 1149 XPUSHs (
1150 SvIV (AvARRAY (av)[BER_CLASS ]) == ASN_UNIVERSAL 1150 SvIV (AvARRAY (av)[BER_CLASS]) == ASN_UNIVERSAL
1151 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_OBJECT_IDENTIFIER 1151 && SvIV (AvARRAY (av)[BER_TAG ]) == ASN_OBJECT_IDENTIFIER
1152 && !SvIV (AvARRAY (av)[BER_CONSTRUCTED]) 1152 && !SvIV (AvARRAY (av)[BER_FLAGS])
1153 && (!SvOK (oid) || sv_eq (AvARRAY (av)[BER_DATA], oid)) 1153 && (!SvOK (oid) || sv_eq (AvARRAY (av)[BER_DATA], oid))
1154 ? newSVsv (AvARRAY (av)[BER_DATA]) : &PL_sv_undef); 1154 ? newSVsv (AvARRAY (av)[BER_DATA]) : &PL_sv_undef);
1155} 1155}
1156 1156
1157############################################################################# 1157#############################################################################
1175ber_int (SV *sv) 1175ber_int (SV *sv)
1176 CODE: 1176 CODE:
1177{ 1177{
1178 AV *av = newAV (); 1178 AV *av = newAV ();
1179 av_fill (av, BER_ARRAYSIZE - 1); 1179 av_fill (av, BER_ARRAYSIZE - 1);
1180 AvARRAY (av)[BER_CLASS ] = newSVcacheint (ASN_UNIVERSAL); 1180 AvARRAY (av)[BER_CLASS] = newSVcacheint (ASN_UNIVERSAL);
1181 AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_INTEGER); 1181 AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_INTEGER);
1182 AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (0); 1182 AvARRAY (av)[BER_FLAGS] = newSVcacheint (0);
1183 AvARRAY (av)[BER_DATA ] = newSVsv (sv); 1183 AvARRAY (av)[BER_DATA ] = newSVsv (sv);
1184 RETVAL = newRV_noinc ((SV *)av); 1184 RETVAL = newRV_noinc ((SV *)av);
1185} 1185}
1186 OUTPUT: RETVAL 1186 OUTPUT: RETVAL
1187 1187
1188# TODO: not arrayref, but elements? 1188# TODO: not arrayref, but elements?
1190ber_seq (SV *arrayref) 1190ber_seq (SV *arrayref)
1191 CODE: 1191 CODE:
1192{ 1192{
1193 AV *av = newAV (); 1193 AV *av = newAV ();
1194 av_fill (av, BER_ARRAYSIZE - 1); 1194 av_fill (av, BER_ARRAYSIZE - 1);
1195 AvARRAY (av)[BER_CLASS ] = newSVcacheint (ASN_UNIVERSAL); 1195 AvARRAY (av)[BER_CLASS] = newSVcacheint (ASN_UNIVERSAL);
1196 AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_SEQUENCE); 1196 AvARRAY (av)[BER_TAG ] = newSVcacheint (ASN_SEQUENCE);
1197 AvARRAY (av)[BER_CONSTRUCTED] = newSVcacheint (1); 1197 AvARRAY (av)[BER_FLAGS] = newSVcacheint (1);
1198 AvARRAY (av)[BER_DATA ] = newSVsv (arrayref); 1198 AvARRAY (av)[BER_DATA ] = newSVsv (arrayref);
1199 RETVAL = newRV_noinc ((SV *)av); 1199 RETVAL = newRV_noinc ((SV *)av);
1200} 1200}
1201 OUTPUT: RETVAL 1201 OUTPUT: RETVAL
1202 1202
1203MODULE = Convert::BER::XS PACKAGE = Convert::BER::XS::Profile 1203MODULE = Convert::BER::XS PACKAGE = Convert::BER::XS::Profile

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines