aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1fix
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2004-09-15 11:46:28 +0000
committerLev Walkin <vlm@lionet.info>2004-09-15 11:46:28 +0000
commitcaaf7a5414872cab694d9c399b9172aa441b3cbd (patch)
treefe202cc5d162018d46a83b01aaa7bbb6edf7aeff /libasn1fix
parent9fb535979761624f72bdfc9fecbca19889c4a9de (diff)
added ChoiceIdentifier
Diffstat (limited to 'libasn1fix')
-rw-r--r--libasn1fix/asn1fix_misc.c89
1 files changed, 55 insertions, 34 deletions
diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c
index 8e70c901..c022abce 100644
--- a/libasn1fix/asn1fix_misc.c
+++ b/libasn1fix/asn1fix_misc.c
@@ -23,12 +23,13 @@ asn1f_printable_value(asn1p_value_t *v) {
int ret;
#define ENSURE(len) do { \
- if(len >= managedptr_len) { \
+ int __len = (len); \
+ if(__len >= managedptr_len) { \
if(managedptr) \
free(managedptr); \
- managedptr = malloc(len + 1); \
+ managedptr = malloc(__len + 1); \
if(managedptr) { \
- managedptr_len = len; \
+ managedptr_len = __len; \
} else { \
managedptr_len = 0; \
return "<memory allocation error>"; \
@@ -42,37 +43,8 @@ asn1f_printable_value(asn1p_value_t *v) {
switch(v->type) {
case ATV_NOVALUE:
return "<NO VALUE>";
- case ATV_REFERENCED:
- {
- asn1p_ref_t *ref;
- char reflen;
- char *ptr;
- int i;
-
- assert(v->value.reference);
- ref = v->value.reference;
- reflen = ref->comp_count; /* Number of dots */
- for(i = 0; i < ref->comp_count; i++)
- reflen += strlen(ref->components[i].name);
- /*
- * Make sure we have a buffer of this size.
- */
- ENSURE(reflen);
-
- /*
- * Fill-up the buffer.
- */
- ptr = managedptr;
- for(i = 0; i < ref->comp_count; i++) {
- char *nc;
- if(i) *ptr++ = '.';
- for(nc = ref->components[i].name; *nc; nc++)
- *ptr++ = *nc;
- }
- *ptr++ = '\0';
- assert(reflen == (ptr - managedptr));
- return managedptr;
- }
+ case ATV_NULL:
+ return "NULL";
case ATV_REAL:
ret = snprintf(buf, sizeof(buf), "%f", v->value.v_double);
if(ret >= (ssize_t)sizeof(buf))
@@ -141,6 +113,55 @@ asn1f_printable_value(asn1p_value_t *v) {
assert((ptr - managedptr) == len);
return managedptr;
}
+ case ATV_REFERENCED:
+ {
+ asn1p_ref_t *ref;
+ char reflen;
+ char *ptr;
+ int i;
+
+ assert(v->value.reference);
+ ref = v->value.reference;
+ reflen = ref->comp_count; /* Number of dots */
+ for(i = 0; i < ref->comp_count; i++)
+ reflen += strlen(ref->components[i].name);
+ /*
+ * Make sure we have a buffer of this size.
+ */
+ ENSURE(reflen);
+
+ /*
+ * Fill-up the buffer.
+ */
+ ptr = managedptr;
+ for(i = 0; i < ref->comp_count; i++) {
+ char *nc;
+ if(i) *ptr++ = '.';
+ for(nc = ref->components[i].name; *nc; nc++)
+ *ptr++ = *nc;
+ }
+ *ptr++ = '\0';
+ assert(reflen == (ptr - managedptr));
+ return managedptr;
+ }
+ case ATV_CHOICE_IDENTIFIER:
+ {
+ char *cid = v->value.choice_identifier.identifier;
+ char const *vptr = asn1f_printable_value(
+ v->value.choice_identifier.value);
+ char *val;
+
+ val = strdup(vptr);
+ if(!val) return "<memory allocation error>";
+
+ ENSURE(strlen(cid) + sizeof(": ") + strlen(val));
+
+ ret = snprintf(managedptr, managedptr_len + 1,
+ "%s: %s", cid, val);
+ assert(ret >= 0 && ret <= managedptr_len);
+ free(val);
+ return managedptr;
+ }
}
return "<some complex value>";