Parse size limitations to SEQ OF.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@21393 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2007-07-02 10:13:50 +00:00
parent a041a6bf66
commit fa8cbd4607

View File

@@ -65,7 +65,7 @@ struct string_list {
%union { %union {
int constant; int constant;
struct value *value; struct value *value;
struct range range; struct range *range;
char *name; char *name;
Type *type; Type *type;
Member *member; Member *member;
@@ -214,7 +214,7 @@ struct string_list {
%type <members> NamedNumberList %type <members> NamedNumberList
%type <objid> objid objid_list objid_element objid_opt %type <objid> objid objid_list objid_element objid_opt
%type <range> range %type <range> range size
%type <sl> referencenames %type <sl> referencenames
@@ -224,6 +224,8 @@ struct string_list {
%type <constraint_spec> ContentsConstraint %type <constraint_spec> ContentsConstraint
%type <constraint_spec> UserDefinedConstraint %type <constraint_spec> UserDefinedConstraint
%start ModuleDefinition %start ModuleDefinition
%% %%
@@ -337,14 +339,41 @@ BooleanType : kw_BOOLEAN
range : '(' Value RANGE Value ')' range : '(' Value RANGE Value ')'
{ {
if($2->type != integervalue || if($2->type != integervalue)
$4->type != integervalue) error_message("Non-integer used in first part of range");
error_message("Non-integer value used in range"); if($2->type != integervalue)
$$.min = $2->u.integervalue; error_message("Non-integer in second part of range");
$$.max = $4->u.integervalue; $$ = ecalloc(1, sizeof(*$$));
$$->min = $2->u.integervalue;
$$->max = $4->u.integervalue;
}
| '(' Value RANGE kw_MAX ')'
{
if($2->type != integervalue)
error_message("Non-integer in first part of range");
$$ = ecalloc(1, sizeof(*$$));
$$->min = $2->u.integervalue;
$$->max = $2->u.integervalue - 1;
}
| '(' kw_MIN RANGE Value ')'
{
if($4->type != integervalue)
error_message("Non-integer in second part of range");
$$ = ecalloc(1, sizeof(*$$));
$$->min = $4->u.integervalue + 2;
$$->max = $4->u.integervalue;
}
| '(' Value ')'
{
if($2->type != integervalue)
error_message("Non-integer used in limit");
$$ = ecalloc(1, sizeof(*$$));
$$->min = $2->u.integervalue;
$$->max = $2->u.integervalue;
} }
; ;
IntegerType : kw_INTEGER IntegerType : kw_INTEGER
{ {
$$ = new_tag(ASN1_C_UNIV, UT_Integer, $$ = new_tag(ASN1_C_UNIV, UT_Integer,
@@ -353,8 +382,7 @@ IntegerType : kw_INTEGER
| kw_INTEGER range | kw_INTEGER range
{ {
$$ = new_type(TInteger); $$ = new_type(TInteger);
$$->range = emalloc(sizeof(*$$->range)); $$->range = $2;
*($$->range) = $2;
$$ = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, $$); $$ = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, $$);
} }
| kw_INTEGER '{' NamedNumberList '}' | kw_INTEGER '{' NamedNumberList '}'
@@ -439,6 +467,13 @@ NullType : kw_NULL
} }
; ;
size :
{ $$ = NULL; }
| kw_SIZE range
{ $$ = $2; }
;
SequenceType : kw_SEQUENCE '{' /* ComponentTypeLists */ ComponentTypeList '}' SequenceType : kw_SEQUENCE '{' /* ComponentTypeLists */ ComponentTypeList '}'
{ {
$$ = new_type(TSequence); $$ = new_type(TSequence);
@@ -453,10 +488,11 @@ SequenceType : kw_SEQUENCE '{' /* ComponentTypeLists */ ComponentTypeList '}'
} }
; ;
SequenceOfType : kw_SEQUENCE kw_OF Type SequenceOfType : kw_SEQUENCE size kw_OF Type
{ {
$$ = new_type(TSequenceOf); $$ = new_type(TSequenceOf);
$$->subtype = $3; $$->range = $2;
$$->subtype = $4;
$$ = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, $$); $$ = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, $$);
} }
; ;