Convert-BER-XS
view release on metacpan or search on metacpan
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <math.h>
// C99 required!
// this is not just for comments, but also for
// integer constant semantics,
// sscanf format modifiers and more.
enum {
// ASN_TAG
ASN_BOOLEAN = 0x01,
ASN_INTEGER = 0x02,
ASN_BIT_STRING = 0x03,
ASN_OCTET_STRING = 0x04,
ASN_NULL = 0x05,
ASN_OBJECT_IDENTIFIER = 0x06,
ASN_OID = 0x06,
ASN_OBJECT_DESCRIPTOR = 0x07,
ASN_EXTERNAL = 0x08,
ASN_REAL = 0x09,
ASN_ENUMERATED = 0x0a,
ASN_EMBEDDED_PDV = 0x0b,
ASN_UTF8_STRING = 0x0c,
ASN_RELATIVE_OID = 0x0d,
ASN_SEQUENCE = 0x10,
ASN_SET = 0x11,
ASN_NUMERIC_STRING = 0x12,
ASN_PRINTABLE_STRING = 0x13,
ASN_TELETEX_STRING = 0x14,
ASN_T61_STRING = 0x14,
ASN_VIDEOTEX_STRING = 0x15,
ASN_IA5_STRING = 0x16,
ASN_ASCII_STRING = 0x16,
ASN_UTC_TIME = 0x17,
ASN_GENERALIZED_TIME = 0x18,
ASN_GRAPHIC_STRING = 0x19,
ASN_VISIBLE_STRING = 0x1a,
ASN_ISO646_STRING = 0x1a,
ASN_GENERAL_STRING = 0x1b,
ASN_UNIVERSAL_STRING = 0x1c,
ASN_CHARACTER_STRING = 0x1d,
ASN_BMP_STRING = 0x1e,
ASN_TAG_BER = 0x1f,
ASN_TAG_MASK = 0x1f,
// primitive/constructed
ASN_CONSTRUCTED = 0x20,
// ASN_CLASS
ASN_UNIVERSAL = 0x00,
ASN_APPLICATION = 0x01,
ASN_CONTEXT = 0x02,
ASN_PRIVATE = 0x03,
ASN_CLASS_MASK = 0xc0,
ASN_CLASS_SHIFT = 6,
// ASN_APPLICATION SNMP
SNMP_IPADDRESS = 0x00,
SNMP_COUNTER32 = 0x01,
SNMP_GAUGE32 = 0x02,
SNMP_UNSIGNED32 = 0x02,
SNMP_TIMETICKS = 0x03,
SNMP_OPAQUE = 0x04,
SNMP_COUNTER64 = 0x06,
};
// tlow-level types this module can ecode the above (and more) into
enum {
BER_TYPE_BYTES,
BER_TYPE_UTF8,
BER_TYPE_UCS2,
BER_TYPE_UCS4,
BER_TYPE_INT,
BER_TYPE_OID,
BER_TYPE_RELOID,
BER_TYPE_NULL,
BER_TYPE_BOOL,
BER_TYPE_REAL,
BER_TYPE_IPADDRESS,
BER_TYPE_CROAK,
break;
case BER_TYPE_IPADDRESS:
{
U8 ip[4];
sscanf (SvPV_nolen (data), "%hhu.%hhu.%hhu.%hhu", ip + 0, ip + 1, ip + 2, ip + 3);
encode_data ((const char *)ip, sizeof (ip));
}
break;
case BER_TYPE_UCS2:
encode_ucs (data, 2);
break;
case BER_TYPE_UCS4:
encode_ucs (data, 4);
break;
case BER_TYPE_REAL:
encode_real (data);
break;
case BER_TYPE_CROAK:
croak ("class/tag %d/%d mapped to BER_TYPE_CROAK", klass, tag);
default:
croak ("unconfigured/unsupported class/tag %d/%d", klass, tag);
}
}
/////////////////////////////////////////////////////////////////////////////
MODULE = Convert::BER::XS PACKAGE = Convert::BER::XS
PROTOTYPES: ENABLE
BOOT:
{
HV *stash = gv_stashpv ("Convert::BER::XS", 1);
profile_stash = gv_stashpv ("Convert::BER::XS::Profile", 1);
static const struct {
const char *name;
IV iv;
} *civ, const_iv[] = {
#define const_iv(name) { # name, name },
const_iv (ASN_BOOLEAN)
const_iv (ASN_INTEGER)
const_iv (ASN_BIT_STRING)
const_iv (ASN_OCTET_STRING)
const_iv (ASN_NULL)
const_iv (ASN_OBJECT_IDENTIFIER)
const_iv (ASN_OBJECT_DESCRIPTOR)
const_iv (ASN_OID)
const_iv (ASN_EXTERNAL)
const_iv (ASN_REAL)
const_iv (ASN_SEQUENCE)
const_iv (ASN_ENUMERATED)
const_iv (ASN_EMBEDDED_PDV)
const_iv (ASN_UTF8_STRING)
const_iv (ASN_RELATIVE_OID)
const_iv (ASN_SET)
const_iv (ASN_NUMERIC_STRING)
const_iv (ASN_PRINTABLE_STRING)
const_iv (ASN_TELETEX_STRING)
const_iv (ASN_T61_STRING)
const_iv (ASN_VIDEOTEX_STRING)
const_iv (ASN_IA5_STRING)
const_iv (ASN_ASCII_STRING)
const_iv (ASN_UTC_TIME)
const_iv (ASN_GENERALIZED_TIME)
const_iv (ASN_GRAPHIC_STRING)
const_iv (ASN_VISIBLE_STRING)
const_iv (ASN_ISO646_STRING)
const_iv (ASN_GENERAL_STRING)
const_iv (ASN_UNIVERSAL_STRING)
const_iv (ASN_CHARACTER_STRING)
const_iv (ASN_BMP_STRING)
const_iv (ASN_UNIVERSAL)
const_iv (ASN_APPLICATION)
const_iv (ASN_CONTEXT)
const_iv (ASN_PRIVATE)
const_iv (BER_CLASS)
const_iv (BER_TAG)
const_iv (BER_FLAGS)
const_iv (BER_DATA)
const_iv (BER_TYPE_BYTES)
const_iv (BER_TYPE_UTF8)
const_iv (BER_TYPE_UCS2)
const_iv (BER_TYPE_UCS4)
const_iv (BER_TYPE_INT)
const_iv (BER_TYPE_OID)
const_iv (BER_TYPE_RELOID)
const_iv (BER_TYPE_NULL)
const_iv (BER_TYPE_BOOL)
const_iv (BER_TYPE_REAL)
const_iv (BER_TYPE_IPADDRESS)
const_iv (BER_TYPE_CROAK)
const_iv (SNMP_IPADDRESS)
const_iv (SNMP_COUNTER32)
const_iv (SNMP_GAUGE32)
const_iv (SNMP_UNSIGNED32)
const_iv (SNMP_TIMETICKS)
const_iv (SNMP_OPAQUE)
const_iv (SNMP_COUNTER64)
};
for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
}
void
ber_decode (SV *ber, SV *profile = &PL_sv_undef)
ALIAS:
ber_decode_prefix = 1
( run in 0.782 second using v1.01-cache-2.11-cpan-71847e10f99 )