asn1: note IMPLICIT CHOICE promoted to EXPLICIT
Record when a CHOICE field is promoted from IMPLICIT to EXPLICIT and convey this in the ASN.1 compiler's JSON output, so that other tools (e.g. which have a representation isomorphic to the original ASN.1) may use it.
This commit is contained in:

committed by
Nico Williams

parent
5398425cd2
commit
16179383fb
@@ -1432,8 +1432,10 @@ TaggedType : Tag tagenv Type
|
|||||||
* IMPLICIT tags of CHOICE types are EXPLICIT
|
* IMPLICIT tags of CHOICE types are EXPLICIT
|
||||||
* instead.
|
* instead.
|
||||||
*/
|
*/
|
||||||
if (t->type == TChoice)
|
if (t->type == TChoice) {
|
||||||
|
$$->implicit_choice = 1;
|
||||||
$$->tag.tagenv = TE_EXPLICIT;
|
$$->tag.tagenv = TE_EXPLICIT;
|
||||||
|
}
|
||||||
if($3->type == TTag && $2 == TE_IMPLICIT) {
|
if($3->type == TTag && $2 == TE_IMPLICIT) {
|
||||||
$$->subtype = $3->subtype;
|
$$->subtype = $3->subtype;
|
||||||
free($3);
|
free($3);
|
||||||
|
@@ -1529,6 +1529,9 @@ define_type(int level, const char *name, const char *basename, Type *pt, Type *t
|
|||||||
fprintf(jsonfile, "\"ttype\":\"TeletexString\",\"ctype\":\"heim_general_string\"");
|
fprintf(jsonfile, "\"ttype\":\"TeletexString\",\"ctype\":\"heim_general_string\"");
|
||||||
break;
|
break;
|
||||||
case TTag:
|
case TTag:
|
||||||
|
if (t->implicit_choice) {
|
||||||
|
fprintf(jsonfile, "\"desired_tagenv\":\"IMPLICIT\",");
|
||||||
|
}
|
||||||
fprintf(jsonfile, "\"tagclass\":\"%s\",\"tagvalue\":%d,\"tagenv\":\"%s\",\n",
|
fprintf(jsonfile, "\"tagclass\":\"%s\",\"tagvalue\":%d,\"tagenv\":\"%s\",\n",
|
||||||
tagclassnames[t->tag.tagclass], t->tag.tagvalue,
|
tagclassnames[t->tag.tagclass], t->tag.tagvalue,
|
||||||
t->tag.tagenv == TE_EXPLICIT ? "EXPLICIT" : "IMPLICIT");
|
t->tag.tagenv == TE_EXPLICIT ? "EXPLICIT" : "IMPLICIT");
|
||||||
|
@@ -200,6 +200,7 @@ struct type {
|
|||||||
struct range *range;
|
struct range *range;
|
||||||
struct constraint_spec *constraint;
|
struct constraint_spec *constraint;
|
||||||
unsigned long id;
|
unsigned long id;
|
||||||
|
unsigned int implicit_choice:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct type Type;
|
typedef struct type Type;
|
||||||
|
Reference in New Issue
Block a user