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:
@@ -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, $$);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
Reference in New Issue
Block a user