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.5 by root, Fri Apr 19 23:50:53 2019 UTC vs.
Revision 1.6 by root, Sat Apr 20 01:03:59 2019 UTC

72 BER_TYPE_OID, 72 BER_TYPE_OID,
73 BER_TYPE_RELOID, 73 BER_TYPE_RELOID,
74 BER_TYPE_NULL, 74 BER_TYPE_NULL,
75 BER_TYPE_BOOL, 75 BER_TYPE_BOOL,
76 BER_TYPE_REAL, 76 BER_TYPE_REAL,
77 BER_TYPE_IPADDRESS,
77 BER_TYPE_CROAK, 78 BER_TYPE_CROAK,
78}; 79};
79 80
80enum { 81enum {
81 BER_CLASS = 0, 82 BER_CLASS = 0,
129 130
130static profile_type * 131static profile_type *
131SvPROFILE (SV *profile) 132SvPROFILE (SV *profile)
132{ 133{
133 if (!SvOK (profile)) 134 if (!SvOK (profile))
134 profile = default_profile; 135 return default_profile;
135 136
136 if (!SvROK (profile)) 137 if (!SvROK (profile))
137 croak ("invalid profile"); 138 croak ("invalid profile");
138 139
139 profile = SvRV (profile); 140 profile = SvRV (profile);
194 { ASN_UNIVERSAL, ASN_UTF8_STRING , BER_TYPE_UTF8 }, 195 { ASN_UNIVERSAL, ASN_UTF8_STRING , BER_TYPE_UTF8 },
195 { ASN_UNIVERSAL, ASN_BMP_STRING , BER_TYPE_UCS2 }, 196 { ASN_UNIVERSAL, ASN_BMP_STRING , BER_TYPE_UCS2 },
196 { ASN_UNIVERSAL, ASN_UNIVERSAL_STRING , BER_TYPE_UCS4 }, 197 { ASN_UNIVERSAL, ASN_UNIVERSAL_STRING , BER_TYPE_UCS4 },
197 }; 198 };
198 199
199 //const_iv (SNMP_IPADDRESS)
200 //const_iv (SNMP_COUNTER32)
201 //const_iv (SNMP_UNSIGNED32)
202 //const_iv (SNMP_TIMETICKS)
203 //const_iv (SNMP_OPAQUE)
204 //const_iv (SNMP_COUNTER64)
205
206 for (celem = default_map + sizeof (default_map) / sizeof (default_map [0]); celem > default_map; celem--) 200 for (celem = default_map + sizeof (default_map) / sizeof (default_map [0]); celem > default_map; celem--)
207 profile_set ((void *)sv, celem->klass, celem->tag, celem->type); 201 profile_set ((void *)sv, celem->klass, celem->tag, celem->type);
208 202
209 return sv_bless (newRV_noinc (sv), profile_stash); 203 return sv_bless (newRV_noinc (sv), profile_stash);
210} 204}
313 307
314 do 308 do
315 val = (val << 8) | *data++; 309 val = (val << 8) | *data++;
316 while (--len); 310 while (--len);
317 311
318 // the cats to IV relies on implementation-defined behaviour (two's complement cast) 312 // the cast to IV relies on implementation-defined behaviour (two's complement cast)
319 // but that's ok, as perl relies on it as well. 313 // but that's ok, as perl relies on it as well.
320 return negative ? newSViv ((IV)val) : newSVuv (val); 314 return negative ? newSViv ((IV)val) : newSVuv (val);
321} 315}
322 316
323static SV * 317static SV *
436 case BER_TYPE_BOOL: 430 case BER_TYPE_BOOL:
437 { 431 {
438 U32 len = get_length (); 432 U32 len = get_length ();
439 433
440 if (len != 1) 434 if (len != 1)
441 croak ("BOOLEAN type with invalid length %d encountered", len); 435 croak ("BER_TYPE_BOOLEAN type with invalid length %d encountered", len);
442 436
443 res = newSVcacheint (get_u8 () ? 0 : 1); 437 res = newSVcacheint (get_u8 () ? 0 : 1);
444 } 438 }
445 break; 439 break;
446 440
461 SvUTF8_on (res); 455 SvUTF8_on (res);
462 break; 456 break;
463 457
464 case BER_TYPE_BYTES: 458 case BER_TYPE_BYTES:
465 res = decode_data (); 459 res = decode_data ();
460 break;
461
462 case BER_TYPE_IPADDRESS:
463 {
464 U32 len = get_length ();
465
466 if (len != 4)
467 croak ("BER_TYPE_IPADDRESS type with invalid length %d encountered", len);
468
469 U8 c1 = get_u8 ();
470 U8 c2 = get_u8 ();
471 U8 c3 = get_u8 ();
472 U8 c4 = get_u8 ();
473
474 res = newSVpvf ("%d.%d.%d.%d", c1, c2, c3, c4);
475 }
466 break; 476 break;
467 477
468 case BER_TYPE_REAL: 478 case BER_TYPE_REAL:
469 case BER_TYPE_UCS2: 479 case BER_TYPE_UCS2:
470 case BER_TYPE_UCS4: 480 case BER_TYPE_UCS4:
828 case BER_TYPE_UTF8: 838 case BER_TYPE_UTF8:
829 { 839 {
830 STRLEN len; 840 STRLEN len;
831 const char *ptr = SvPVutf8 (data, len); 841 const char *ptr = SvPVutf8 (data, len);
832 encode_data (ptr, len); 842 encode_data (ptr, len);
843 }
844 break;
845
846 case BER_TYPE_IPADDRESS:
847 {
848 U8 ip[4];
849 sscanf (SvPV_nolen (data), "%hhu.%hhu.%hhu.%hhu", ip + 0, ip + 1, ip + 2, ip + 3);
850 encode_data ((const char *)ip, sizeof (ip));
833 } 851 }
834 break; 852 break;
835 853
836 case BER_TYPE_REAL: 854 case BER_TYPE_REAL:
837 case BER_TYPE_UCS2: 855 case BER_TYPE_UCS2:
911 const_iv (BER_TYPE_OID) 929 const_iv (BER_TYPE_OID)
912 const_iv (BER_TYPE_RELOID) 930 const_iv (BER_TYPE_RELOID)
913 const_iv (BER_TYPE_NULL) 931 const_iv (BER_TYPE_NULL)
914 const_iv (BER_TYPE_BOOL) 932 const_iv (BER_TYPE_BOOL)
915 const_iv (BER_TYPE_REAL) 933 const_iv (BER_TYPE_REAL)
934 const_iv (BER_TYPE_IPADDRESS)
916 const_iv (BER_TYPE_CROAK) 935 const_iv (BER_TYPE_CROAK)
917 936
918 const_iv (SNMP_IPADDRESS) 937 const_iv (SNMP_IPADDRESS)
919 const_iv (SNMP_COUNTER32) 938 const_iv (SNMP_COUNTER32)
920 const_iv (SNMP_UNSIGNED32) 939 const_iv (SNMP_UNSIGNED32)
921 const_iv (SNMP_TIMETICKS) 940 const_iv (SNMP_TIMETICKS)
922 const_iv (SNMP_OPAQUE) 941 const_iv (SNMP_OPAQUE)
923 const_iv (SNMP_COUNTER64) 942 const_iv (SNMP_COUNTER64)
924
925 }; 943 };
926 944
927 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--) 945 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
928 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv)); 946 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
929
930 default_profile = profile_new ();
931} 947}
932 948
933SV * 949SV *
934ber_decode (SV *ber, SV *profile = &PL_sv_undef) 950ber_decode (SV *ber, SV *profile = &PL_sv_undef)
935 CODE: 951 CODE:
1069new (SV *klass) 1085new (SV *klass)
1070 CODE: 1086 CODE:
1071 RETVAL = profile_new (); 1087 RETVAL = profile_new ();
1072 OUTPUT: RETVAL 1088 OUTPUT: RETVAL
1073 1089
1090void
1091set (SV *profile, int klass, int tag, int type)
1092 CODE:
1093 profile_set (SvPROFILE (profile), klass, tag, type);
1094
1095IV
1096get (SV *profile, int klass, int tag)
1097 CODE:
1098 RETVAL = profile_lookup (SvPROFILE (profile), klass, tag);
1099 OUTPUT: RETVAL
1100
1101void
1102_set_default (SV *profile)
1103 CODE:
1104 default_profile = SvPROFILE (profile);
1105
1106

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines