Commit caaf7a54 authored by Lev Walkin's avatar Lev Walkin

added ChoiceIdentifier

parent 9fb53597
...@@ -23,12 +23,13 @@ asn1f_printable_value(asn1p_value_t *v) { ...@@ -23,12 +23,13 @@ asn1f_printable_value(asn1p_value_t *v) {
int ret; int ret;
#define ENSURE(len) do { \ #define ENSURE(len) do { \
if(len >= managedptr_len) { \ int __len = (len); \
if(__len >= managedptr_len) { \
if(managedptr) \ if(managedptr) \
free(managedptr); \ free(managedptr); \
managedptr = malloc(len + 1); \ managedptr = malloc(__len + 1); \
if(managedptr) { \ if(managedptr) { \
managedptr_len = len; \ managedptr_len = __len; \
} else { \ } else { \
managedptr_len = 0; \ managedptr_len = 0; \
return "<memory allocation error>"; \ return "<memory allocation error>"; \
...@@ -42,37 +43,8 @@ asn1f_printable_value(asn1p_value_t *v) { ...@@ -42,37 +43,8 @@ asn1f_printable_value(asn1p_value_t *v) {
switch(v->type) { switch(v->type) {
case ATV_NOVALUE: case ATV_NOVALUE:
return "<NO VALUE>"; return "<NO VALUE>";
case ATV_REFERENCED: case ATV_NULL:
{ return "NULL";
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_REAL: case ATV_REAL:
ret = snprintf(buf, sizeof(buf), "%f", v->value.v_double); ret = snprintf(buf, sizeof(buf), "%f", v->value.v_double);
if(ret >= (ssize_t)sizeof(buf)) if(ret >= (ssize_t)sizeof(buf))
...@@ -141,6 +113,55 @@ asn1f_printable_value(asn1p_value_t *v) { ...@@ -141,6 +113,55 @@ asn1f_printable_value(asn1p_value_t *v) {
assert((ptr - managedptr) == len); assert((ptr - managedptr) == len);
return managedptr; 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>"; return "<some complex value>";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment