Add support for parsing part of the Constraint-s
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16355 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		@@ -48,6 +48,7 @@
 | 
			
		||||
RCSID("$Id$");
 | 
			
		||||
 | 
			
		||||
static Type *new_type (Typetype t);
 | 
			
		||||
static struct constraint_spec *new_constraint_spec(enum ctype);
 | 
			
		||||
static Type *new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype);
 | 
			
		||||
void yyerror (const char *);
 | 
			
		||||
static struct objid *new_objid(const char *label, int value);
 | 
			
		||||
@@ -73,6 +74,7 @@ struct string_list {
 | 
			
		||||
    struct string_list *sl;
 | 
			
		||||
    struct tagtype tag;
 | 
			
		||||
    struct memhead *members;
 | 
			
		||||
    struct constraint_spec *constraint_spec;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
%token kw_ABSENT
 | 
			
		||||
@@ -183,6 +185,7 @@ struct string_list {
 | 
			
		||||
%type <type> BitStringType
 | 
			
		||||
%type <type> BooleanType
 | 
			
		||||
%type <type> ChoiceType
 | 
			
		||||
%type <type> ConstrainedType
 | 
			
		||||
%type <type> EnumeratedType
 | 
			
		||||
%type <type> IntegerType
 | 
			
		||||
%type <type> NullType
 | 
			
		||||
@@ -215,6 +218,12 @@ struct string_list {
 | 
			
		||||
 | 
			
		||||
%type <sl> referencenames
 | 
			
		||||
 | 
			
		||||
%type <constraint_spec> Constraint
 | 
			
		||||
%type <constraint_spec> ConstraintSpec
 | 
			
		||||
%type <constraint_spec> GeneralConstraint
 | 
			
		||||
%type <constraint_spec> ContentsConstraint
 | 
			
		||||
%type <constraint_spec> UserDefinedConstraint
 | 
			
		||||
 | 
			
		||||
%start ModuleDefinition
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
@@ -300,6 +309,7 @@ TypeAssignment	: IDENTIFIER EEQUAL Type
 | 
			
		||||
 | 
			
		||||
Type		: BuiltinType
 | 
			
		||||
		| ReferencedType
 | 
			
		||||
		| ConstrainedType
 | 
			
		||||
		;
 | 
			
		||||
 | 
			
		||||
BuiltinType	: BitStringType
 | 
			
		||||
@@ -507,6 +517,65 @@ UsefulType	: kw_GeneralizedTime
 | 
			
		||||
		}
 | 
			
		||||
		;
 | 
			
		||||
 | 
			
		||||
ConstrainedType	: Type Constraint
 | 
			
		||||
		{
 | 
			
		||||
		    /* if (Constraint.type == contentConstrant) {
 | 
			
		||||
		       assert(Constraint.u.constraint.type == octetstring|bitstring-w/o-NamedBitList); // remember to check type reference too
 | 
			
		||||
		       if (Constraint.u.constraint.type) {
 | 
			
		||||
		         assert((Constraint.u.constraint.type.length % 8) == 0);
 | 
			
		||||
		       }
 | 
			
		||||
		      }
 | 
			
		||||
		      if (Constraint.u.constraint.encoding) {
 | 
			
		||||
		        type == der-oid|ber-oid
 | 
			
		||||
		      }
 | 
			
		||||
		    */
 | 
			
		||||
		}
 | 
			
		||||
		;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Constraint	: '(' ConstraintSpec  ExceptionSpec ')'
 | 
			
		||||
		{
 | 
			
		||||
		    $$ = $2;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
ExceptionSpec	:
 | 
			
		||||
 | 
			
		||||
ConstraintSpec	: GeneralConstraint
 | 
			
		||||
 | 
			
		||||
GeneralConstraint: ContentsConstraint
 | 
			
		||||
		| UserDefinedConstraint
 | 
			
		||||
		;
 | 
			
		||||
 | 
			
		||||
ContentsConstraint: kw_CONTAINING Type
 | 
			
		||||
		{
 | 
			
		||||
		    $$ = new_constraint_spec(CT_CONTENTS);
 | 
			
		||||
		    $$->u.content.type = $2;
 | 
			
		||||
		    $$->u.content.encoding = NULL;
 | 
			
		||||
		}
 | 
			
		||||
		| kw_ENCODED kw_BY Value
 | 
			
		||||
		{
 | 
			
		||||
		    if ($3->type != objectidentifiervalue)
 | 
			
		||||
			error_message("Non-OID used in ENCODED BY constraint");
 | 
			
		||||
		    $$ = new_constraint_spec(CT_CONTENTS);
 | 
			
		||||
		    $$->u.content.type = NULL;
 | 
			
		||||
		    $$->u.content.encoding = $3;
 | 
			
		||||
		}
 | 
			
		||||
		| kw_CONTAINING Type kw_ENCODED kw_BY Value
 | 
			
		||||
		{
 | 
			
		||||
		    if ($5->type != objectidentifiervalue)
 | 
			
		||||
			error_message("Non-OID used in ENCODED BY constraint");
 | 
			
		||||
		    $$ = new_constraint_spec(CT_CONTENTS);
 | 
			
		||||
		    $$->u.content.type = $2;
 | 
			
		||||
		    $$->u.content.encoding = $5;
 | 
			
		||||
		}
 | 
			
		||||
		;
 | 
			
		||||
 | 
			
		||||
UserDefinedConstraint: kw_CONSTRAINED kw_BY '{' '}'
 | 
			
		||||
		{
 | 
			
		||||
		    $$ = new_constraint_spec(CT_USER);
 | 
			
		||||
		}
 | 
			
		||||
		;
 | 
			
		||||
 | 
			
		||||
TaggedType	: Tag tagenv Type
 | 
			
		||||
		{
 | 
			
		||||
			$$ = new_type(TTag);
 | 
			
		||||
@@ -861,6 +930,14 @@ new_type (Typetype tt)
 | 
			
		||||
    return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct constraint_spec *
 | 
			
		||||
new_constraint_spec(enum ctype ct)
 | 
			
		||||
{
 | 
			
		||||
    struct constraint_spec *c = ecalloc(1, sizeof(*c));
 | 
			
		||||
    c->ctype = ct;
 | 
			
		||||
    return c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void fix_labels2(Type *t, const char *prefix);
 | 
			
		||||
static void fix_labels1(struct memhead *members, const char *prefix)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user