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 * 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);

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\""); 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");

View File

@@ -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;