From 61ffcf48a924ff176154165118dc0f1516e0e959 Mon Sep 17 00:00:00 2001 From: Tomas Kukosa Date: Mon, 14 May 2007 13:39:31 +0000 Subject: - more variants of dissect_per_open_type_*() - move asn1_get_real() to asn1.c/.h svn path=/trunk/; revision=21757 --- epan/asn1.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) (limited to 'epan/asn1.c') diff --git a/epan/asn1.c b/epan/asn1.c index 8d1053304b..667a848780 100644 --- a/epan/asn1.c +++ b/epan/asn1.c @@ -27,21 +27,52 @@ # include "config.h" #endif +#include +#include + #include #include #include "asn1.h" void asn1_ctx_init(asn1_ctx_t *actx, asn1_enc_e encoding, gboolean aligned, packet_info *pinfo) { + memset(actx, '\0', sizeof(*actx)); + actx->signature = ASN1_CTX_SIGNATURE; actx->encoding = encoding; actx->aligned = aligned; actx->pinfo = pinfo; - actx->created_item = NULL; - actx->value_ptr = NULL; - actx->private_data = NULL; +} + +gboolean asn1_ctx_check_signature(asn1_ctx_t *actx) { + return actx->signature == ASN1_CTX_SIGNATURE; } void asn1_ctx_clean_external(asn1_ctx_t *actx) { memset(&actx->external, '\0', sizeof(actx->external)); actx->external.hf_index = -1; } + +double asn1_get_real(const guint8 *real_ptr, gint real_len) { + guint8 octet; + const guint8 *p; + guint8 *buf; + double val = 0; + + if (real_len < 1) return val; + octet = real_ptr[0]; + p = real_ptr + 1; + real_len -= 1; + if (octet & 0x80) { /* binary encoding */ + } else if (octet & 0x40) { /* SpecialRealValue */ + switch (octet & 0x3F) { + case 0x00: val = HUGE_VAL; break; + case 0x01: val = -HUGE_VAL; break; + } + } else { /* decimal encoding */ + buf = ep_alloc0(real_len + 1); + memcpy(buf, p, real_len); + val = atof(buf); + } + + return val; +} -- cgit v1.2.3