diff options
Diffstat (limited to 'libasn1parser/asn1p_y.y')
-rw-r--r-- | libasn1parser/asn1p_y.y | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index f9c7ed4f..b6be6f6f 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -286,6 +286,7 @@ static asn1p_value_t * %type <a_value> ContainedSubtype %type <a_ctype> ConstraintSpec %type <a_ctype> ConstraintRangeSpec +%type <a_value> RestrictedCharacterStringValue %type <a_wsynt> optWithSyntax %type <a_wsynt> WithSyntax %type <a_wsynt> WithSyntaxFormat @@ -1346,9 +1347,8 @@ Value: $$ = _convert_bitstring2binary($1, 'H'); checkmem($$); } - | TOK_cstring { - $$ = asn1p_value_frombuf($1.buf, $1.len, 0); - checkmem($$); + | RestrictedCharacterStringValue { + $$ = $$; } | SignedNumber { $$ = $1; @@ -1386,6 +1386,38 @@ DefinedValue: } ; + +RestrictedCharacterStringValue: + TOK_cstring { + $$ = asn1p_value_frombuf($1.buf, $1.len, 0); + checkmem($$); + } + | '{' TOK_number ',' TOK_number '}' { + asn1c_integer_t v = ($2 << 4) + $4; + if($2 > 7) return yyerror("X.680:2003, #37.14 " + "mandates 0..7 range for Tuple's TableColumn"); + if($4 > 15) return yyerror("X.680:2003, #37.14 " + "mandates 0..15 range for Tuple's TableRow"); + $$ = asn1p_value_fromint(v); + checkmem($$); + $$->type = ATV_TUPLE; + } + | '{' TOK_number ',' TOK_number ',' TOK_number ',' TOK_number '}' { + asn1c_integer_t v = ($2 << 24) | ($4 << 16) | ($6 << 8) | $8; + if($2 > 127) return yyerror("X.680:2003, #37.12 " + "mandates 0..127 range for Quadruple's Group"); + if($4 > 255) return yyerror("X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Plane"); + if($6 > 255) return yyerror("X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Row"); + if($8 > 255) return yyerror("X.680:2003, #37.12 " + "mandates 0..255 range for Quadruple's Cell"); + $$ = asn1p_value_fromint(v); + checkmem($$); + $$->type = ATV_QUADRUPLE; + } + ; + Opaque: TOK_opaque { $$.len = $1.len + 1; @@ -1544,6 +1576,9 @@ ElementSetSpec: ConstraintSubtypeElement { $$ = $1; } + | TOK_ALL TOK_EXCEPT ConstraintSubtypeElement { + CONSTRAINT_INSERT($$, ACT_CA_AEX, $3, 0); + } | ElementSetSpec Union ConstraintSubtypeElement { CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3); } @@ -1663,9 +1698,8 @@ SingleValue: | SignedNumber { $$ = $1; } - | TOK_cstring { - $$ = asn1p_value_frombuf($1.buf, $1.len, 0); - checkmem($$); + | RestrictedCharacterStringValue { + $$ = $1; } | Identifier { asn1p_ref_t *ref; |