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:
Luke Howard
2022-11-14 17:27:06 +11:00
committed by Nico Williams
parent 5398425cd2
commit 16179383fb
3 changed files with 7 additions and 1 deletions

View File

@@ -1432,8 +1432,10 @@ TaggedType : Tag tagenv Type
* IMPLICIT tags of CHOICE types are EXPLICIT
* instead.
*/
if (t->type == TChoice)
if (t->type == TChoice) {
$$->implicit_choice = 1;
$$->tag.tagenv = TE_EXPLICIT;
}
if($3->type == TTag && $2 == TE_IMPLICIT) {
$$->subtype = $3->subtype;
free($3);

View File

@@ -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\"");
break;
case TTag:
if (t->implicit_choice) {
fprintf(jsonfile, "\"desired_tagenv\":\"IMPLICIT\",");
}
fprintf(jsonfile, "\"tagclass\":\"%s\",\"tagvalue\":%d,\"tagenv\":\"%s\",\n",
tagclassnames[t->tag.tagclass], t->tag.tagvalue,
t->tag.tagenv == TE_EXPLICIT ? "EXPLICIT" : "IMPLICIT");

View File

@@ -200,6 +200,7 @@ struct type {
struct range *range;
struct constraint_spec *constraint;
unsigned long id;
unsigned int implicit_choice:1;
};
typedef struct type Type;