xref: /freebsd/crypto/heimdal/lib/asn1/asn1parse.y (revision 1b748759)
1ae771770SStanislav Sedov /*
2ae771770SStanislav Sedov  * Copyright (c) 1997 - 2007 Kungliga Tekniska Högskolan
3ae771770SStanislav Sedov  * (Royal Institute of Technology, Stockholm, Sweden).
4ae771770SStanislav Sedov  * All rights reserved.
5ae771770SStanislav Sedov  *
6ae771770SStanislav Sedov  * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
7ae771770SStanislav Sedov  *
8ae771770SStanislav Sedov  * Redistribution and use in source and binary forms, with or without
9ae771770SStanislav Sedov  * modification, are permitted provided that the following conditions
10ae771770SStanislav Sedov  * are met:
11ae771770SStanislav Sedov  *
12ae771770SStanislav Sedov  * 1. Redistributions of source code must retain the above copyright
13ae771770SStanislav Sedov  *    notice, this list of conditions and the following disclaimer.
14ae771770SStanislav Sedov  *
15ae771770SStanislav Sedov  * 2. Redistributions in binary form must reproduce the above copyright
16ae771770SStanislav Sedov  *    notice, this list of conditions and the following disclaimer in the
17ae771770SStanislav Sedov  *    documentation and/or other materials provided with the distribution.
18ae771770SStanislav Sedov  *
19ae771770SStanislav Sedov  * 3. Neither the name of the Institute nor the names of its contributors
20ae771770SStanislav Sedov  *    may be used to endorse or promote products derived from this software
21ae771770SStanislav Sedov  *    without specific prior written permission.
22ae771770SStanislav Sedov  *
23ae771770SStanislav Sedov  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24ae771770SStanislav Sedov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25ae771770SStanislav Sedov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26ae771770SStanislav Sedov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27ae771770SStanislav Sedov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28ae771770SStanislav Sedov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29ae771770SStanislav Sedov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30ae771770SStanislav Sedov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31ae771770SStanislav Sedov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32ae771770SStanislav Sedov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33ae771770SStanislav Sedov  * SUCH DAMAGE.
34ae771770SStanislav Sedov  */
35ae771770SStanislav Sedov 
36ae771770SStanislav Sedov /* $Id$ */
37ae771770SStanislav Sedov 
38ae771770SStanislav Sedov %{
39ae771770SStanislav Sedov 
40ae771770SStanislav Sedov #include <config.h>
41ae771770SStanislav Sedov 
42ae771770SStanislav Sedov #include <stdio.h>
43ae771770SStanislav Sedov #include <stdlib.h>
44ae771770SStanislav Sedov #include <string.h>
45ae771770SStanislav Sedov #include "symbol.h"
46ae771770SStanislav Sedov #include "lex.h"
47ae771770SStanislav Sedov #include "gen_locl.h"
48ae771770SStanislav Sedov #include "der.h"
49ae771770SStanislav Sedov 
50ae771770SStanislav Sedov RCSID("$Id$");
51ae771770SStanislav Sedov 
52ae771770SStanislav Sedov static Type *new_type (Typetype t);
53ae771770SStanislav Sedov static struct constraint_spec *new_constraint_spec(enum ctype);
54ae771770SStanislav Sedov static Type *new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype);
55ae771770SStanislav Sedov void yyerror (const char *);
56ae771770SStanislav Sedov static struct objid *new_objid(const char *label, int value);
57ae771770SStanislav Sedov static void add_oid_to_tail(struct objid *, struct objid *);
58ae771770SStanislav Sedov static void fix_labels(Symbol *s);
59ae771770SStanislav Sedov 
60ae771770SStanislav Sedov struct string_list {
61ae771770SStanislav Sedov     char *string;
62ae771770SStanislav Sedov     struct string_list *next;
63ae771770SStanislav Sedov };
64ae771770SStanislav Sedov 
65ae771770SStanislav Sedov /* Declarations for Bison */
66ae771770SStanislav Sedov #define YYMALLOC malloc
67ae771770SStanislav Sedov #define YYFREE   free
68ae771770SStanislav Sedov 
69ae771770SStanislav Sedov %}
70ae771770SStanislav Sedov 
71ae771770SStanislav Sedov %union {
721b748759SDimitry Andric     int64_t constant;
73ae771770SStanislav Sedov     struct value *value;
74ae771770SStanislav Sedov     struct range *range;
75ae771770SStanislav Sedov     char *name;
76ae771770SStanislav Sedov     Type *type;
77ae771770SStanislav Sedov     Member *member;
78ae771770SStanislav Sedov     struct objid *objid;
79ae771770SStanislav Sedov     char *defval;
80ae771770SStanislav Sedov     struct string_list *sl;
81ae771770SStanislav Sedov     struct tagtype tag;
82ae771770SStanislav Sedov     struct memhead *members;
83ae771770SStanislav Sedov     struct constraint_spec *constraint_spec;
84ae771770SStanislav Sedov }
85ae771770SStanislav Sedov 
86ae771770SStanislav Sedov %token kw_ABSENT
87ae771770SStanislav Sedov %token kw_ABSTRACT_SYNTAX
88ae771770SStanislav Sedov %token kw_ALL
89ae771770SStanislav Sedov %token kw_APPLICATION
90ae771770SStanislav Sedov %token kw_AUTOMATIC
91ae771770SStanislav Sedov %token kw_BEGIN
92ae771770SStanislav Sedov %token kw_BIT
93ae771770SStanislav Sedov %token kw_BMPString
94ae771770SStanislav Sedov %token kw_BOOLEAN
95ae771770SStanislav Sedov %token kw_BY
96ae771770SStanislav Sedov %token kw_CHARACTER
97ae771770SStanislav Sedov %token kw_CHOICE
98ae771770SStanislav Sedov %token kw_CLASS
99ae771770SStanislav Sedov %token kw_COMPONENT
100ae771770SStanislav Sedov %token kw_COMPONENTS
101ae771770SStanislav Sedov %token kw_CONSTRAINED
102ae771770SStanislav Sedov %token kw_CONTAINING
103ae771770SStanislav Sedov %token kw_DEFAULT
104ae771770SStanislav Sedov %token kw_DEFINITIONS
105ae771770SStanislav Sedov %token kw_EMBEDDED
106ae771770SStanislav Sedov %token kw_ENCODED
107ae771770SStanislav Sedov %token kw_END
108ae771770SStanislav Sedov %token kw_ENUMERATED
109ae771770SStanislav Sedov %token kw_EXCEPT
110ae771770SStanislav Sedov %token kw_EXPLICIT
111ae771770SStanislav Sedov %token kw_EXPORTS
112ae771770SStanislav Sedov %token kw_EXTENSIBILITY
113ae771770SStanislav Sedov %token kw_EXTERNAL
114ae771770SStanislav Sedov %token kw_FALSE
115ae771770SStanislav Sedov %token kw_FROM
116ae771770SStanislav Sedov %token kw_GeneralString
117ae771770SStanislav Sedov %token kw_GeneralizedTime
118ae771770SStanislav Sedov %token kw_GraphicString
119ae771770SStanislav Sedov %token kw_IA5String
120ae771770SStanislav Sedov %token kw_IDENTIFIER
121ae771770SStanislav Sedov %token kw_IMPLICIT
122ae771770SStanislav Sedov %token kw_IMPLIED
123ae771770SStanislav Sedov %token kw_IMPORTS
124ae771770SStanislav Sedov %token kw_INCLUDES
125ae771770SStanislav Sedov %token kw_INSTANCE
126ae771770SStanislav Sedov %token kw_INTEGER
127ae771770SStanislav Sedov %token kw_INTERSECTION
128ae771770SStanislav Sedov %token kw_ISO646String
129ae771770SStanislav Sedov %token kw_MAX
130ae771770SStanislav Sedov %token kw_MIN
131ae771770SStanislav Sedov %token kw_MINUS_INFINITY
132ae771770SStanislav Sedov %token kw_NULL
133ae771770SStanislav Sedov %token kw_NumericString
134ae771770SStanislav Sedov %token kw_OBJECT
135ae771770SStanislav Sedov %token kw_OCTET
136ae771770SStanislav Sedov %token kw_OF
137ae771770SStanislav Sedov %token kw_OPTIONAL
138ae771770SStanislav Sedov %token kw_ObjectDescriptor
139ae771770SStanislav Sedov %token kw_PATTERN
140ae771770SStanislav Sedov %token kw_PDV
141ae771770SStanislav Sedov %token kw_PLUS_INFINITY
142ae771770SStanislav Sedov %token kw_PRESENT
143ae771770SStanislav Sedov %token kw_PRIVATE
144ae771770SStanislav Sedov %token kw_PrintableString
145ae771770SStanislav Sedov %token kw_REAL
146ae771770SStanislav Sedov %token kw_RELATIVE_OID
147ae771770SStanislav Sedov %token kw_SEQUENCE
148ae771770SStanislav Sedov %token kw_SET
149ae771770SStanislav Sedov %token kw_SIZE
150ae771770SStanislav Sedov %token kw_STRING
151ae771770SStanislav Sedov %token kw_SYNTAX
152ae771770SStanislav Sedov %token kw_T61String
153ae771770SStanislav Sedov %token kw_TAGS
154ae771770SStanislav Sedov %token kw_TRUE
155ae771770SStanislav Sedov %token kw_TYPE_IDENTIFIER
156ae771770SStanislav Sedov %token kw_TeletexString
157ae771770SStanislav Sedov %token kw_UNION
158ae771770SStanislav Sedov %token kw_UNIQUE
159ae771770SStanislav Sedov %token kw_UNIVERSAL
160ae771770SStanislav Sedov %token kw_UTCTime
161ae771770SStanislav Sedov %token kw_UTF8String
162ae771770SStanislav Sedov %token kw_UniversalString
163ae771770SStanislav Sedov %token kw_VideotexString
164ae771770SStanislav Sedov %token kw_VisibleString
165ae771770SStanislav Sedov %token kw_WITH
166ae771770SStanislav Sedov 
167ae771770SStanislav Sedov %token RANGE
168ae771770SStanislav Sedov %token EEQUAL
169ae771770SStanislav Sedov %token ELLIPSIS
170ae771770SStanislav Sedov 
171ae771770SStanislav Sedov %token <name> IDENTIFIER  referencename
172ae771770SStanislav Sedov %token <name> STRING
173ae771770SStanislav Sedov 
174ae771770SStanislav Sedov %token <constant> NUMBER
175ae771770SStanislav Sedov %type <constant> SignedNumber
176ae771770SStanislav Sedov %type <constant> Class tagenv
177ae771770SStanislav Sedov 
178ae771770SStanislav Sedov %type <value> Value
179ae771770SStanislav Sedov %type <value> BuiltinValue
180ae771770SStanislav Sedov %type <value> IntegerValue
181ae771770SStanislav Sedov %type <value> BooleanValue
182ae771770SStanislav Sedov %type <value> ObjectIdentifierValue
183ae771770SStanislav Sedov %type <value> CharacterStringValue
184ae771770SStanislav Sedov %type <value> NullValue
185ae771770SStanislav Sedov %type <value> DefinedValue
186ae771770SStanislav Sedov %type <value> ReferencedValue
187ae771770SStanislav Sedov %type <value> Valuereference
188ae771770SStanislav Sedov 
189ae771770SStanislav Sedov %type <type> Type
190ae771770SStanislav Sedov %type <type> BuiltinType
191ae771770SStanislav Sedov %type <type> BitStringType
192ae771770SStanislav Sedov %type <type> BooleanType
193ae771770SStanislav Sedov %type <type> ChoiceType
194ae771770SStanislav Sedov %type <type> ConstrainedType
195ae771770SStanislav Sedov %type <type> EnumeratedType
196ae771770SStanislav Sedov %type <type> IntegerType
197ae771770SStanislav Sedov %type <type> NullType
198ae771770SStanislav Sedov %type <type> OctetStringType
199ae771770SStanislav Sedov %type <type> SequenceType
200ae771770SStanislav Sedov %type <type> SequenceOfType
201ae771770SStanislav Sedov %type <type> SetType
202ae771770SStanislav Sedov %type <type> SetOfType
203ae771770SStanislav Sedov %type <type> TaggedType
204ae771770SStanislav Sedov %type <type> ReferencedType
205ae771770SStanislav Sedov %type <type> DefinedType
206ae771770SStanislav Sedov %type <type> UsefulType
207ae771770SStanislav Sedov %type <type> ObjectIdentifierType
208ae771770SStanislav Sedov %type <type> CharacterStringType
209ae771770SStanislav Sedov %type <type> RestrictedCharactedStringType
210ae771770SStanislav Sedov 
211ae771770SStanislav Sedov %type <tag> Tag
212ae771770SStanislav Sedov 
213ae771770SStanislav Sedov %type <member> ComponentType
214ae771770SStanislav Sedov %type <member> NamedBit
215ae771770SStanislav Sedov %type <member> NamedNumber
216ae771770SStanislav Sedov %type <member> NamedType
217ae771770SStanislav Sedov %type <members> ComponentTypeList
218ae771770SStanislav Sedov %type <members> Enumerations
219ae771770SStanislav Sedov %type <members> NamedBitList
220ae771770SStanislav Sedov %type <members> NamedNumberList
221ae771770SStanislav Sedov 
222ae771770SStanislav Sedov %type <objid> objid objid_list objid_element objid_opt
223ae771770SStanislav Sedov %type <range> range size
224ae771770SStanislav Sedov 
225ae771770SStanislav Sedov %type <sl> referencenames
226ae771770SStanislav Sedov 
227ae771770SStanislav Sedov %type <constraint_spec> Constraint
228ae771770SStanislav Sedov %type <constraint_spec> ConstraintSpec
229ae771770SStanislav Sedov %type <constraint_spec> GeneralConstraint
230ae771770SStanislav Sedov %type <constraint_spec> ContentsConstraint
231ae771770SStanislav Sedov %type <constraint_spec> UserDefinedConstraint
232ae771770SStanislav Sedov 
233ae771770SStanislav Sedov 
234ae771770SStanislav Sedov 
235ae771770SStanislav Sedov %start ModuleDefinition
236ae771770SStanislav Sedov 
237ae771770SStanislav Sedov %%
238ae771770SStanislav Sedov 
239ae771770SStanislav Sedov ModuleDefinition: IDENTIFIER objid_opt kw_DEFINITIONS TagDefault ExtensionDefault
240ae771770SStanislav Sedov 			EEQUAL kw_BEGIN ModuleBody kw_END
241ae771770SStanislav Sedov 		{
242ae771770SStanislav Sedov 			checkundefined();
243ae771770SStanislav Sedov 		}
244ae771770SStanislav Sedov 		;
245ae771770SStanislav Sedov 
246ae771770SStanislav Sedov TagDefault	: kw_EXPLICIT kw_TAGS
247ae771770SStanislav Sedov 		| kw_IMPLICIT kw_TAGS
248ae771770SStanislav Sedov 		      { lex_error_message("implicit tagging is not supported"); }
249ae771770SStanislav Sedov 		| kw_AUTOMATIC kw_TAGS
250ae771770SStanislav Sedov 		      { lex_error_message("automatic tagging is not supported"); }
251ae771770SStanislav Sedov 		| /* empty */
252ae771770SStanislav Sedov 		;
253ae771770SStanislav Sedov 
254ae771770SStanislav Sedov ExtensionDefault: kw_EXTENSIBILITY kw_IMPLIED
255ae771770SStanislav Sedov 		      { lex_error_message("no extensibility options supported"); }
256ae771770SStanislav Sedov 		| /* empty */
257ae771770SStanislav Sedov 		;
258ae771770SStanislav Sedov 
259ae771770SStanislav Sedov ModuleBody	: Exports Imports AssignmentList
260ae771770SStanislav Sedov 		| /* empty */
261ae771770SStanislav Sedov 		;
262ae771770SStanislav Sedov 
263ae771770SStanislav Sedov Imports		: kw_IMPORTS SymbolsImported ';'
264ae771770SStanislav Sedov 		| /* empty */
265ae771770SStanislav Sedov 		;
266ae771770SStanislav Sedov 
267ae771770SStanislav Sedov SymbolsImported	: SymbolsFromModuleList
268ae771770SStanislav Sedov 		| /* empty */
269ae771770SStanislav Sedov 		;
270ae771770SStanislav Sedov 
271ae771770SStanislav Sedov SymbolsFromModuleList: SymbolsFromModule
272ae771770SStanislav Sedov 		| SymbolsFromModuleList SymbolsFromModule
273ae771770SStanislav Sedov 		;
274ae771770SStanislav Sedov 
275ae771770SStanislav Sedov SymbolsFromModule: referencenames kw_FROM IDENTIFIER objid_opt
276ae771770SStanislav Sedov 		{
277ae771770SStanislav Sedov 		    struct string_list *sl;
278ae771770SStanislav Sedov 		    for(sl = $1; sl != NULL; sl = sl->next) {
279ae771770SStanislav Sedov 			Symbol *s = addsym(sl->string);
280ae771770SStanislav Sedov 			s->stype = Stype;
281ae771770SStanislav Sedov 			gen_template_import(s);
282ae771770SStanislav Sedov 		    }
283ae771770SStanislav Sedov 		    add_import($3);
284ae771770SStanislav Sedov 		}
285ae771770SStanislav Sedov 		;
286ae771770SStanislav Sedov 
287ae771770SStanislav Sedov Exports		: kw_EXPORTS referencenames ';'
288ae771770SStanislav Sedov 		{
289ae771770SStanislav Sedov 		    struct string_list *sl;
290ae771770SStanislav Sedov 		    for(sl = $2; sl != NULL; sl = sl->next)
291ae771770SStanislav Sedov 			add_export(sl->string);
292ae771770SStanislav Sedov 		}
293ae771770SStanislav Sedov 		| kw_EXPORTS kw_ALL
294ae771770SStanislav Sedov 		| /* empty */
295ae771770SStanislav Sedov 		;
296ae771770SStanislav Sedov 
297ae771770SStanislav Sedov AssignmentList	: Assignment
298ae771770SStanislav Sedov 		| Assignment AssignmentList
299ae771770SStanislav Sedov 		;
300ae771770SStanislav Sedov 
301ae771770SStanislav Sedov Assignment	: TypeAssignment
302ae771770SStanislav Sedov 		| ValueAssignment
303ae771770SStanislav Sedov 		;
304ae771770SStanislav Sedov 
305ae771770SStanislav Sedov referencenames	: IDENTIFIER ',' referencenames
306ae771770SStanislav Sedov 		{
307ae771770SStanislav Sedov 		    $$ = emalloc(sizeof(*$$));
308ae771770SStanislav Sedov 		    $$->string = $1;
309ae771770SStanislav Sedov 		    $$->next = $3;
310ae771770SStanislav Sedov 		}
311ae771770SStanislav Sedov 		| IDENTIFIER
312ae771770SStanislav Sedov 		{
313ae771770SStanislav Sedov 		    $$ = emalloc(sizeof(*$$));
314ae771770SStanislav Sedov 		    $$->string = $1;
315ae771770SStanislav Sedov 		    $$->next = NULL;
316ae771770SStanislav Sedov 		}
317ae771770SStanislav Sedov 		;
318ae771770SStanislav Sedov 
319ae771770SStanislav Sedov TypeAssignment	: IDENTIFIER EEQUAL Type
320ae771770SStanislav Sedov 		{
321ae771770SStanislav Sedov 		    Symbol *s = addsym ($1);
322ae771770SStanislav Sedov 		    s->stype = Stype;
323ae771770SStanislav Sedov 		    s->type = $3;
324ae771770SStanislav Sedov 		    fix_labels(s);
325ae771770SStanislav Sedov 		    generate_type (s);
326ae771770SStanislav Sedov 		}
327ae771770SStanislav Sedov 		;
328ae771770SStanislav Sedov 
329ae771770SStanislav Sedov Type		: BuiltinType
330ae771770SStanislav Sedov 		| ReferencedType
331ae771770SStanislav Sedov 		| ConstrainedType
332ae771770SStanislav Sedov 		;
333ae771770SStanislav Sedov 
334ae771770SStanislav Sedov BuiltinType	: BitStringType
335ae771770SStanislav Sedov 		| BooleanType
336ae771770SStanislav Sedov 		| CharacterStringType
337ae771770SStanislav Sedov 		| ChoiceType
338ae771770SStanislav Sedov 		| EnumeratedType
339ae771770SStanislav Sedov 		| IntegerType
340ae771770SStanislav Sedov 		| NullType
341ae771770SStanislav Sedov 		| ObjectIdentifierType
342ae771770SStanislav Sedov 		| OctetStringType
343ae771770SStanislav Sedov 		| SequenceType
344ae771770SStanislav Sedov 		| SequenceOfType
345ae771770SStanislav Sedov 		| SetType
346ae771770SStanislav Sedov 		| SetOfType
347ae771770SStanislav Sedov 		| TaggedType
348ae771770SStanislav Sedov 		;
349ae771770SStanislav Sedov 
350ae771770SStanislav Sedov BooleanType	: kw_BOOLEAN
351ae771770SStanislav Sedov 		{
352ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_Boolean,
353ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TBoolean));
354ae771770SStanislav Sedov 		}
355ae771770SStanislav Sedov 		;
356ae771770SStanislav Sedov 
357ae771770SStanislav Sedov range		: '(' Value RANGE Value ')'
358ae771770SStanislav Sedov 		{
359ae771770SStanislav Sedov 		    if($2->type != integervalue)
360ae771770SStanislav Sedov 			lex_error_message("Non-integer used in first part of range");
361ae771770SStanislav Sedov 		    if($2->type != integervalue)
362ae771770SStanislav Sedov 			lex_error_message("Non-integer in second part of range");
363ae771770SStanislav Sedov 		    $$ = ecalloc(1, sizeof(*$$));
364ae771770SStanislav Sedov 		    $$->min = $2->u.integervalue;
365ae771770SStanislav Sedov 		    $$->max = $4->u.integervalue;
366ae771770SStanislav Sedov 		}
367ae771770SStanislav Sedov 		| '(' Value RANGE kw_MAX ')'
368ae771770SStanislav Sedov 		{
369ae771770SStanislav Sedov 		    if($2->type != integervalue)
370ae771770SStanislav Sedov 			lex_error_message("Non-integer in first part of range");
371ae771770SStanislav Sedov 		    $$ = ecalloc(1, sizeof(*$$));
372ae771770SStanislav Sedov 		    $$->min = $2->u.integervalue;
3731b748759SDimitry Andric 		    $$->max = INT_MAX;
374ae771770SStanislav Sedov 		}
375ae771770SStanislav Sedov 		| '(' kw_MIN RANGE Value ')'
376ae771770SStanislav Sedov 		{
377ae771770SStanislav Sedov 		    if($4->type != integervalue)
378ae771770SStanislav Sedov 			lex_error_message("Non-integer in second part of range");
379ae771770SStanislav Sedov 		    $$ = ecalloc(1, sizeof(*$$));
3801b748759SDimitry Andric 		    $$->min = INT_MIN;
381ae771770SStanislav Sedov 		    $$->max = $4->u.integervalue;
382ae771770SStanislav Sedov 		}
383ae771770SStanislav Sedov 		| '(' Value ')'
384ae771770SStanislav Sedov 		{
385ae771770SStanislav Sedov 		    if($2->type != integervalue)
386ae771770SStanislav Sedov 			lex_error_message("Non-integer used in limit");
387ae771770SStanislav Sedov 		    $$ = ecalloc(1, sizeof(*$$));
388ae771770SStanislav Sedov 		    $$->min = $2->u.integervalue;
389ae771770SStanislav Sedov 		    $$->max = $2->u.integervalue;
390ae771770SStanislav Sedov 		}
391ae771770SStanislav Sedov 		;
392ae771770SStanislav Sedov 
393ae771770SStanislav Sedov 
394ae771770SStanislav Sedov IntegerType	: kw_INTEGER
395ae771770SStanislav Sedov 		{
396ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_Integer,
397ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TInteger));
398ae771770SStanislav Sedov 		}
399ae771770SStanislav Sedov 		| kw_INTEGER range
400ae771770SStanislav Sedov 		{
401ae771770SStanislav Sedov 			$$ = new_type(TInteger);
402ae771770SStanislav Sedov 			$$->range = $2;
403ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, $$);
404ae771770SStanislav Sedov 		}
405ae771770SStanislav Sedov 		| kw_INTEGER '{' NamedNumberList '}'
406ae771770SStanislav Sedov 		{
407ae771770SStanislav Sedov 		  $$ = new_type(TInteger);
408ae771770SStanislav Sedov 		  $$->members = $3;
409ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, $$);
410ae771770SStanislav Sedov 		}
411ae771770SStanislav Sedov 		;
412ae771770SStanislav Sedov 
413ae771770SStanislav Sedov NamedNumberList	: NamedNumber
414ae771770SStanislav Sedov 		{
415ae771770SStanislav Sedov 			$$ = emalloc(sizeof(*$$));
416ae771770SStanislav Sedov 			ASN1_TAILQ_INIT($$);
417ae771770SStanislav Sedov 			ASN1_TAILQ_INSERT_HEAD($$, $1, members);
418ae771770SStanislav Sedov 		}
419ae771770SStanislav Sedov 		| NamedNumberList ',' NamedNumber
420ae771770SStanislav Sedov 		{
421ae771770SStanislav Sedov 			ASN1_TAILQ_INSERT_TAIL($1, $3, members);
422ae771770SStanislav Sedov 			$$ = $1;
423ae771770SStanislav Sedov 		}
424ae771770SStanislav Sedov 		| NamedNumberList ',' ELLIPSIS
425ae771770SStanislav Sedov 			{ $$ = $1; } /* XXX used for Enumerations */
426ae771770SStanislav Sedov 		;
427ae771770SStanislav Sedov 
428ae771770SStanislav Sedov NamedNumber	: IDENTIFIER '(' SignedNumber ')'
429ae771770SStanislav Sedov 		{
430ae771770SStanislav Sedov 			$$ = emalloc(sizeof(*$$));
431ae771770SStanislav Sedov 			$$->name = $1;
432ae771770SStanislav Sedov 			$$->gen_name = estrdup($1);
433ae771770SStanislav Sedov 			output_name ($$->gen_name);
434ae771770SStanislav Sedov 			$$->val = $3;
435ae771770SStanislav Sedov 			$$->optional = 0;
436ae771770SStanislav Sedov 			$$->ellipsis = 0;
437ae771770SStanislav Sedov 			$$->type = NULL;
438ae771770SStanislav Sedov 		}
439ae771770SStanislav Sedov 		;
440ae771770SStanislav Sedov 
441ae771770SStanislav Sedov EnumeratedType	: kw_ENUMERATED '{' Enumerations '}'
442ae771770SStanislav Sedov 		{
443ae771770SStanislav Sedov 		  $$ = new_type(TInteger);
444ae771770SStanislav Sedov 		  $$->members = $3;
445ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_Enumerated, TE_EXPLICIT, $$);
446ae771770SStanislav Sedov 		}
447ae771770SStanislav Sedov 		;
448ae771770SStanislav Sedov 
449ae771770SStanislav Sedov Enumerations	: NamedNumberList /* XXX */
450ae771770SStanislav Sedov 		;
451ae771770SStanislav Sedov 
452ae771770SStanislav Sedov BitStringType	: kw_BIT kw_STRING
453ae771770SStanislav Sedov 		{
454ae771770SStanislav Sedov 		  $$ = new_type(TBitString);
455ae771770SStanislav Sedov 		  $$->members = emalloc(sizeof(*$$->members));
456ae771770SStanislav Sedov 		  ASN1_TAILQ_INIT($$->members);
457ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_BitString, TE_EXPLICIT, $$);
458ae771770SStanislav Sedov 		}
459ae771770SStanislav Sedov 		| kw_BIT kw_STRING '{' NamedBitList '}'
460ae771770SStanislav Sedov 		{
461ae771770SStanislav Sedov 		  $$ = new_type(TBitString);
462ae771770SStanislav Sedov 		  $$->members = $4;
463ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_BitString, TE_EXPLICIT, $$);
464ae771770SStanislav Sedov 		}
465ae771770SStanislav Sedov 		;
466ae771770SStanislav Sedov 
467ae771770SStanislav Sedov ObjectIdentifierType: kw_OBJECT kw_IDENTIFIER
468ae771770SStanislav Sedov 		{
469ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_OID,
470ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TOID));
471ae771770SStanislav Sedov 		}
472ae771770SStanislav Sedov 		;
473ae771770SStanislav Sedov OctetStringType	: kw_OCTET kw_STRING size
474ae771770SStanislav Sedov 		{
475ae771770SStanislav Sedov 		    Type *t = new_type(TOctetString);
476ae771770SStanislav Sedov 		    t->range = $3;
477ae771770SStanislav Sedov 		    $$ = new_tag(ASN1_C_UNIV, UT_OctetString,
478ae771770SStanislav Sedov 				 TE_EXPLICIT, t);
479ae771770SStanislav Sedov 		}
480ae771770SStanislav Sedov 		;
481ae771770SStanislav Sedov 
482ae771770SStanislav Sedov NullType	: kw_NULL
483ae771770SStanislav Sedov 		{
484ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_Null,
485ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TNull));
486ae771770SStanislav Sedov 		}
487ae771770SStanislav Sedov 		;
488ae771770SStanislav Sedov 
489ae771770SStanislav Sedov size		:
490ae771770SStanislav Sedov 		{ $$ = NULL; }
491ae771770SStanislav Sedov 		| kw_SIZE range
492ae771770SStanislav Sedov 		{ $$ = $2; }
493ae771770SStanislav Sedov 		;
494ae771770SStanislav Sedov 
495ae771770SStanislav Sedov 
496ae771770SStanislav Sedov SequenceType	: kw_SEQUENCE '{' /* ComponentTypeLists */ ComponentTypeList '}'
497ae771770SStanislav Sedov 		{
498ae771770SStanislav Sedov 		  $$ = new_type(TSequence);
499ae771770SStanislav Sedov 		  $$->members = $3;
500ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, $$);
501ae771770SStanislav Sedov 		}
502ae771770SStanislav Sedov 		| kw_SEQUENCE '{' '}'
503ae771770SStanislav Sedov 		{
504ae771770SStanislav Sedov 		  $$ = new_type(TSequence);
505ae771770SStanislav Sedov 		  $$->members = NULL;
506ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, $$);
507ae771770SStanislav Sedov 		}
508ae771770SStanislav Sedov 		;
509ae771770SStanislav Sedov 
510ae771770SStanislav Sedov SequenceOfType	: kw_SEQUENCE size kw_OF Type
511ae771770SStanislav Sedov 		{
512ae771770SStanislav Sedov 		  $$ = new_type(TSequenceOf);
513ae771770SStanislav Sedov 		  $$->range = $2;
514ae771770SStanislav Sedov 		  $$->subtype = $4;
515ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, $$);
516ae771770SStanislav Sedov 		}
517ae771770SStanislav Sedov 		;
518ae771770SStanislav Sedov 
519ae771770SStanislav Sedov SetType		: kw_SET '{' /* ComponentTypeLists */ ComponentTypeList '}'
520ae771770SStanislav Sedov 		{
521ae771770SStanislav Sedov 		  $$ = new_type(TSet);
522ae771770SStanislav Sedov 		  $$->members = $3;
523ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, $$);
524ae771770SStanislav Sedov 		}
525ae771770SStanislav Sedov 		| kw_SET '{' '}'
526ae771770SStanislav Sedov 		{
527ae771770SStanislav Sedov 		  $$ = new_type(TSet);
528ae771770SStanislav Sedov 		  $$->members = NULL;
529ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, $$);
530ae771770SStanislav Sedov 		}
531ae771770SStanislav Sedov 		;
532ae771770SStanislav Sedov 
533ae771770SStanislav Sedov SetOfType	: kw_SET kw_OF Type
534ae771770SStanislav Sedov 		{
535ae771770SStanislav Sedov 		  $$ = new_type(TSetOf);
536ae771770SStanislav Sedov 		  $$->subtype = $3;
537ae771770SStanislav Sedov 		  $$ = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, $$);
538ae771770SStanislav Sedov 		}
539ae771770SStanislav Sedov 		;
540ae771770SStanislav Sedov 
541ae771770SStanislav Sedov ChoiceType	: kw_CHOICE '{' /* AlternativeTypeLists */ ComponentTypeList '}'
542ae771770SStanislav Sedov 		{
543ae771770SStanislav Sedov 		  $$ = new_type(TChoice);
544ae771770SStanislav Sedov 		  $$->members = $3;
545ae771770SStanislav Sedov 		}
546ae771770SStanislav Sedov 		;
547ae771770SStanislav Sedov 
548ae771770SStanislav Sedov ReferencedType	: DefinedType
549ae771770SStanislav Sedov 		| UsefulType
550ae771770SStanislav Sedov 		;
551ae771770SStanislav Sedov 
552ae771770SStanislav Sedov DefinedType	: IDENTIFIER
553ae771770SStanislav Sedov 		{
554ae771770SStanislav Sedov 		  Symbol *s = addsym($1);
555ae771770SStanislav Sedov 		  $$ = new_type(TType);
556ae771770SStanislav Sedov 		  if(s->stype != Stype && s->stype != SUndefined)
557ae771770SStanislav Sedov 		    lex_error_message ("%s is not a type\n", $1);
558ae771770SStanislav Sedov 		  else
559ae771770SStanislav Sedov 		    $$->symbol = s;
560ae771770SStanislav Sedov 		}
561ae771770SStanislav Sedov 		;
562ae771770SStanislav Sedov 
563ae771770SStanislav Sedov UsefulType	: kw_GeneralizedTime
564ae771770SStanislav Sedov 		{
565ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_GeneralizedTime,
566ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TGeneralizedTime));
567ae771770SStanislav Sedov 		}
568ae771770SStanislav Sedov 		| kw_UTCTime
569ae771770SStanislav Sedov 		{
570ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_UTCTime,
571ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TUTCTime));
572ae771770SStanislav Sedov 		}
573ae771770SStanislav Sedov 		;
574ae771770SStanislav Sedov 
575ae771770SStanislav Sedov ConstrainedType	: Type Constraint
576ae771770SStanislav Sedov 		{
577ae771770SStanislav Sedov 		    /* if (Constraint.type == contentConstrant) {
578ae771770SStanislav Sedov 		       assert(Constraint.u.constraint.type == octetstring|bitstring-w/o-NamedBitList); // remember to check type reference too
579ae771770SStanislav Sedov 		       if (Constraint.u.constraint.type) {
580ae771770SStanislav Sedov 		         assert((Constraint.u.constraint.type.length % 8) == 0);
581ae771770SStanislav Sedov 		       }
582ae771770SStanislav Sedov 		      }
583ae771770SStanislav Sedov 		      if (Constraint.u.constraint.encoding) {
584ae771770SStanislav Sedov 		        type == der-oid|ber-oid
585ae771770SStanislav Sedov 		      }
586ae771770SStanislav Sedov 		    */
587ae771770SStanislav Sedov 		}
588ae771770SStanislav Sedov 		;
589ae771770SStanislav Sedov 
590ae771770SStanislav Sedov 
591ae771770SStanislav Sedov Constraint	: '(' ConstraintSpec ')'
592ae771770SStanislav Sedov 		{
593ae771770SStanislav Sedov 		    $$ = $2;
594ae771770SStanislav Sedov 		}
595ae771770SStanislav Sedov 		;
596ae771770SStanislav Sedov 
597ae771770SStanislav Sedov ConstraintSpec	: GeneralConstraint
598ae771770SStanislav Sedov 		;
599ae771770SStanislav Sedov 
600ae771770SStanislav Sedov GeneralConstraint: ContentsConstraint
601ae771770SStanislav Sedov 		| UserDefinedConstraint
602ae771770SStanislav Sedov 		;
603ae771770SStanislav Sedov 
604ae771770SStanislav Sedov ContentsConstraint: kw_CONTAINING Type
605ae771770SStanislav Sedov 		{
606ae771770SStanislav Sedov 		    $$ = new_constraint_spec(CT_CONTENTS);
607ae771770SStanislav Sedov 		    $$->u.content.type = $2;
608ae771770SStanislav Sedov 		    $$->u.content.encoding = NULL;
609ae771770SStanislav Sedov 		}
610ae771770SStanislav Sedov 		| kw_ENCODED kw_BY Value
611ae771770SStanislav Sedov 		{
612ae771770SStanislav Sedov 		    if ($3->type != objectidentifiervalue)
613ae771770SStanislav Sedov 			lex_error_message("Non-OID used in ENCODED BY constraint");
614ae771770SStanislav Sedov 		    $$ = new_constraint_spec(CT_CONTENTS);
615ae771770SStanislav Sedov 		    $$->u.content.type = NULL;
616ae771770SStanislav Sedov 		    $$->u.content.encoding = $3;
617ae771770SStanislav Sedov 		}
618ae771770SStanislav Sedov 		| kw_CONTAINING Type kw_ENCODED kw_BY Value
619ae771770SStanislav Sedov 		{
620ae771770SStanislav Sedov 		    if ($5->type != objectidentifiervalue)
621ae771770SStanislav Sedov 			lex_error_message("Non-OID used in ENCODED BY constraint");
622ae771770SStanislav Sedov 		    $$ = new_constraint_spec(CT_CONTENTS);
623ae771770SStanislav Sedov 		    $$->u.content.type = $2;
624ae771770SStanislav Sedov 		    $$->u.content.encoding = $5;
625ae771770SStanislav Sedov 		}
626ae771770SStanislav Sedov 		;
627ae771770SStanislav Sedov 
628ae771770SStanislav Sedov UserDefinedConstraint: kw_CONSTRAINED kw_BY '{' '}'
629ae771770SStanislav Sedov 		{
630ae771770SStanislav Sedov 		    $$ = new_constraint_spec(CT_USER);
631ae771770SStanislav Sedov 		}
632ae771770SStanislav Sedov 		;
633ae771770SStanislav Sedov 
634ae771770SStanislav Sedov TaggedType	: Tag tagenv Type
635ae771770SStanislav Sedov 		{
636ae771770SStanislav Sedov 			$$ = new_type(TTag);
637ae771770SStanislav Sedov 			$$->tag = $1;
638ae771770SStanislav Sedov 			$$->tag.tagenv = $2;
639ae771770SStanislav Sedov 			if($3->type == TTag && $2 == TE_IMPLICIT) {
640ae771770SStanislav Sedov 				$$->subtype = $3->subtype;
641ae771770SStanislav Sedov 				free($3);
642ae771770SStanislav Sedov 			} else
643ae771770SStanislav Sedov 				$$->subtype = $3;
644ae771770SStanislav Sedov 		}
645ae771770SStanislav Sedov 		;
646ae771770SStanislav Sedov 
647ae771770SStanislav Sedov Tag		: '[' Class NUMBER ']'
648ae771770SStanislav Sedov 		{
649ae771770SStanislav Sedov 			$$.tagclass = $2;
650ae771770SStanislav Sedov 			$$.tagvalue = $3;
651ae771770SStanislav Sedov 			$$.tagenv = TE_EXPLICIT;
652ae771770SStanislav Sedov 		}
653ae771770SStanislav Sedov 		;
654ae771770SStanislav Sedov 
655ae771770SStanislav Sedov Class		: /* */
656ae771770SStanislav Sedov 		{
657ae771770SStanislav Sedov 			$$ = ASN1_C_CONTEXT;
658ae771770SStanislav Sedov 		}
659ae771770SStanislav Sedov 		| kw_UNIVERSAL
660ae771770SStanislav Sedov 		{
661ae771770SStanislav Sedov 			$$ = ASN1_C_UNIV;
662ae771770SStanislav Sedov 		}
663ae771770SStanislav Sedov 		| kw_APPLICATION
664ae771770SStanislav Sedov 		{
665ae771770SStanislav Sedov 			$$ = ASN1_C_APPL;
666ae771770SStanislav Sedov 		}
667ae771770SStanislav Sedov 		| kw_PRIVATE
668ae771770SStanislav Sedov 		{
669ae771770SStanislav Sedov 			$$ = ASN1_C_PRIVATE;
670ae771770SStanislav Sedov 		}
671ae771770SStanislav Sedov 		;
672ae771770SStanislav Sedov 
673ae771770SStanislav Sedov tagenv		: /* */
674ae771770SStanislav Sedov 		{
675ae771770SStanislav Sedov 			$$ = TE_EXPLICIT;
676ae771770SStanislav Sedov 		}
677ae771770SStanislav Sedov 		| kw_EXPLICIT
678ae771770SStanislav Sedov 		{
679ae771770SStanislav Sedov 			$$ = TE_EXPLICIT;
680ae771770SStanislav Sedov 		}
681ae771770SStanislav Sedov 		| kw_IMPLICIT
682ae771770SStanislav Sedov 		{
683ae771770SStanislav Sedov 			$$ = TE_IMPLICIT;
684ae771770SStanislav Sedov 		}
685ae771770SStanislav Sedov 		;
686ae771770SStanislav Sedov 
687ae771770SStanislav Sedov 
688ae771770SStanislav Sedov ValueAssignment	: IDENTIFIER Type EEQUAL Value
689ae771770SStanislav Sedov 		{
690ae771770SStanislav Sedov 			Symbol *s;
691ae771770SStanislav Sedov 			s = addsym ($1);
692ae771770SStanislav Sedov 
693ae771770SStanislav Sedov 			s->stype = SValue;
694ae771770SStanislav Sedov 			s->value = $4;
695ae771770SStanislav Sedov 			generate_constant (s);
696ae771770SStanislav Sedov 		}
697ae771770SStanislav Sedov 		;
698ae771770SStanislav Sedov 
699ae771770SStanislav Sedov CharacterStringType: RestrictedCharactedStringType
700ae771770SStanislav Sedov 		;
701ae771770SStanislav Sedov 
702ae771770SStanislav Sedov RestrictedCharactedStringType: kw_GeneralString
703ae771770SStanislav Sedov 		{
704ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_GeneralString,
705ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TGeneralString));
706ae771770SStanislav Sedov 		}
707ae771770SStanislav Sedov 		| kw_TeletexString
708ae771770SStanislav Sedov 		{
709ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_TeletexString,
710ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TTeletexString));
711ae771770SStanislav Sedov 		}
712ae771770SStanislav Sedov 		| kw_UTF8String
713ae771770SStanislav Sedov 		{
714ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_UTF8String,
715ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TUTF8String));
716ae771770SStanislav Sedov 		}
717ae771770SStanislav Sedov 		| kw_PrintableString
718ae771770SStanislav Sedov 		{
719ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_PrintableString,
720ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TPrintableString));
721ae771770SStanislav Sedov 		}
722ae771770SStanislav Sedov 		| kw_VisibleString
723ae771770SStanislav Sedov 		{
724ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_VisibleString,
725ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TVisibleString));
726ae771770SStanislav Sedov 		}
727ae771770SStanislav Sedov 		| kw_IA5String
728ae771770SStanislav Sedov 		{
729ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_IA5String,
730ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TIA5String));
731ae771770SStanislav Sedov 		}
732ae771770SStanislav Sedov 		| kw_BMPString
733ae771770SStanislav Sedov 		{
734ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_BMPString,
735ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TBMPString));
736ae771770SStanislav Sedov 		}
737ae771770SStanislav Sedov 		| kw_UniversalString
738ae771770SStanislav Sedov 		{
739ae771770SStanislav Sedov 			$$ = new_tag(ASN1_C_UNIV, UT_UniversalString,
740ae771770SStanislav Sedov 				     TE_EXPLICIT, new_type(TUniversalString));
741ae771770SStanislav Sedov 		}
742ae771770SStanislav Sedov 
743ae771770SStanislav Sedov 		;
744ae771770SStanislav Sedov 
745ae771770SStanislav Sedov ComponentTypeList: ComponentType
746ae771770SStanislav Sedov 		{
747ae771770SStanislav Sedov 			$$ = emalloc(sizeof(*$$));
748ae771770SStanislav Sedov 			ASN1_TAILQ_INIT($$);
749ae771770SStanislav Sedov 			ASN1_TAILQ_INSERT_HEAD($$, $1, members);
750ae771770SStanislav Sedov 		}
751ae771770SStanislav Sedov 		| ComponentTypeList ',' ComponentType
752ae771770SStanislav Sedov 		{
753ae771770SStanislav Sedov 			ASN1_TAILQ_INSERT_TAIL($1, $3, members);
754ae771770SStanislav Sedov 			$$ = $1;
755ae771770SStanislav Sedov 		}
756ae771770SStanislav Sedov 		| ComponentTypeList ',' ELLIPSIS
757ae771770SStanislav Sedov 		{
758ae771770SStanislav Sedov 		        struct member *m = ecalloc(1, sizeof(*m));
759ae771770SStanislav Sedov 			m->name = estrdup("...");
760ae771770SStanislav Sedov 			m->gen_name = estrdup("asn1_ellipsis");
761ae771770SStanislav Sedov 			m->ellipsis = 1;
762ae771770SStanislav Sedov 			ASN1_TAILQ_INSERT_TAIL($1, m, members);
763ae771770SStanislav Sedov 			$$ = $1;
764ae771770SStanislav Sedov 		}
765ae771770SStanislav Sedov 		;
766ae771770SStanislav Sedov 
767ae771770SStanislav Sedov NamedType	: IDENTIFIER Type
768ae771770SStanislav Sedov 		{
769ae771770SStanislav Sedov 		  $$ = emalloc(sizeof(*$$));
770ae771770SStanislav Sedov 		  $$->name = $1;
771ae771770SStanislav Sedov 		  $$->gen_name = estrdup($1);
772ae771770SStanislav Sedov 		  output_name ($$->gen_name);
773ae771770SStanislav Sedov 		  $$->type = $2;
774ae771770SStanislav Sedov 		  $$->ellipsis = 0;
775ae771770SStanislav Sedov 		}
776ae771770SStanislav Sedov 		;
777ae771770SStanislav Sedov 
778ae771770SStanislav Sedov ComponentType	: NamedType
779ae771770SStanislav Sedov 		{
780ae771770SStanislav Sedov 			$$ = $1;
781ae771770SStanislav Sedov 			$$->optional = 0;
782ae771770SStanislav Sedov 			$$->defval = NULL;
783ae771770SStanislav Sedov 		}
784ae771770SStanislav Sedov 		| NamedType kw_OPTIONAL
785ae771770SStanislav Sedov 		{
786ae771770SStanislav Sedov 			$$ = $1;
787ae771770SStanislav Sedov 			$$->optional = 1;
788ae771770SStanislav Sedov 			$$->defval = NULL;
789ae771770SStanislav Sedov 		}
790ae771770SStanislav Sedov 		| NamedType kw_DEFAULT Value
791ae771770SStanislav Sedov 		{
792ae771770SStanislav Sedov 			$$ = $1;
793ae771770SStanislav Sedov 			$$->optional = 0;
794ae771770SStanislav Sedov 			$$->defval = $3;
795ae771770SStanislav Sedov 		}
796ae771770SStanislav Sedov 		;
797ae771770SStanislav Sedov 
798ae771770SStanislav Sedov NamedBitList	: NamedBit
799ae771770SStanislav Sedov 		{
800ae771770SStanislav Sedov 			$$ = emalloc(sizeof(*$$));
801ae771770SStanislav Sedov 			ASN1_TAILQ_INIT($$);
802ae771770SStanislav Sedov 			ASN1_TAILQ_INSERT_HEAD($$, $1, members);
803ae771770SStanislav Sedov 		}
804ae771770SStanislav Sedov 		| NamedBitList ',' NamedBit
805ae771770SStanislav Sedov 		{
806ae771770SStanislav Sedov 			ASN1_TAILQ_INSERT_TAIL($1, $3, members);
807ae771770SStanislav Sedov 			$$ = $1;
808ae771770SStanislav Sedov 		}
809ae771770SStanislav Sedov 		;
810ae771770SStanislav Sedov 
811ae771770SStanislav Sedov NamedBit	: IDENTIFIER '(' NUMBER ')'
812ae771770SStanislav Sedov 		{
813ae771770SStanislav Sedov 		  $$ = emalloc(sizeof(*$$));
814ae771770SStanislav Sedov 		  $$->name = $1;
815ae771770SStanislav Sedov 		  $$->gen_name = estrdup($1);
816ae771770SStanislav Sedov 		  output_name ($$->gen_name);
817ae771770SStanislav Sedov 		  $$->val = $3;
818ae771770SStanislav Sedov 		  $$->optional = 0;
819ae771770SStanislav Sedov 		  $$->ellipsis = 0;
820ae771770SStanislav Sedov 		  $$->type = NULL;
821ae771770SStanislav Sedov 		}
822ae771770SStanislav Sedov 		;
823ae771770SStanislav Sedov 
824ae771770SStanislav Sedov objid_opt	: objid
825ae771770SStanislav Sedov 		| /* empty */ { $$ = NULL; }
826ae771770SStanislav Sedov 		;
827ae771770SStanislav Sedov 
828ae771770SStanislav Sedov objid		: '{' objid_list '}'
829ae771770SStanislav Sedov 		{
830ae771770SStanislav Sedov 			$$ = $2;
831ae771770SStanislav Sedov 		}
832ae771770SStanislav Sedov 		;
833ae771770SStanislav Sedov 
834ae771770SStanislav Sedov objid_list	:  /* empty */
835ae771770SStanislav Sedov 		{
836ae771770SStanislav Sedov 			$$ = NULL;
837ae771770SStanislav Sedov 		}
838ae771770SStanislav Sedov 		| objid_element objid_list
839ae771770SStanislav Sedov 		{
840ae771770SStanislav Sedov 		        if ($2) {
841ae771770SStanislav Sedov 				$$ = $2;
842ae771770SStanislav Sedov 				add_oid_to_tail($2, $1);
843ae771770SStanislav Sedov 			} else {
844ae771770SStanislav Sedov 				$$ = $1;
845ae771770SStanislav Sedov 			}
846ae771770SStanislav Sedov 		}
847ae771770SStanislav Sedov 		;
848ae771770SStanislav Sedov 
849ae771770SStanislav Sedov objid_element	: IDENTIFIER '(' NUMBER ')'
850ae771770SStanislav Sedov 		{
851ae771770SStanislav Sedov 			$$ = new_objid($1, $3);
852ae771770SStanislav Sedov 		}
853ae771770SStanislav Sedov 		| IDENTIFIER
854ae771770SStanislav Sedov 		{
855ae771770SStanislav Sedov 		    Symbol *s = addsym($1);
856ae771770SStanislav Sedov 		    if(s->stype != SValue ||
857ae771770SStanislav Sedov 		       s->value->type != objectidentifiervalue) {
858ae771770SStanislav Sedov 			lex_error_message("%s is not an object identifier\n",
859ae771770SStanislav Sedov 				      s->name);
860ae771770SStanislav Sedov 			exit(1);
861ae771770SStanislav Sedov 		    }
862ae771770SStanislav Sedov 		    $$ = s->value->u.objectidentifiervalue;
863ae771770SStanislav Sedov 		}
864ae771770SStanislav Sedov 		| NUMBER
865ae771770SStanislav Sedov 		{
866ae771770SStanislav Sedov 		    $$ = new_objid(NULL, $1);
867ae771770SStanislav Sedov 		}
868ae771770SStanislav Sedov 		;
869ae771770SStanislav Sedov 
870ae771770SStanislav Sedov Value		: BuiltinValue
871ae771770SStanislav Sedov 		| ReferencedValue
872ae771770SStanislav Sedov 		;
873ae771770SStanislav Sedov 
874ae771770SStanislav Sedov BuiltinValue	: BooleanValue
875ae771770SStanislav Sedov 		| CharacterStringValue
876ae771770SStanislav Sedov 		| IntegerValue
877ae771770SStanislav Sedov 		| ObjectIdentifierValue
878ae771770SStanislav Sedov 		| NullValue
879ae771770SStanislav Sedov 		;
880ae771770SStanislav Sedov 
881ae771770SStanislav Sedov ReferencedValue	: DefinedValue
882ae771770SStanislav Sedov 		;
883ae771770SStanislav Sedov 
884ae771770SStanislav Sedov DefinedValue	: Valuereference
885ae771770SStanislav Sedov 		;
886ae771770SStanislav Sedov 
887ae771770SStanislav Sedov Valuereference	: IDENTIFIER
888ae771770SStanislav Sedov 		{
889ae771770SStanislav Sedov 			Symbol *s = addsym($1);
890ae771770SStanislav Sedov 			if(s->stype != SValue)
891ae771770SStanislav Sedov 				lex_error_message ("%s is not a value\n",
892ae771770SStanislav Sedov 						s->name);
893ae771770SStanislav Sedov 			else
894ae771770SStanislav Sedov 				$$ = s->value;
895ae771770SStanislav Sedov 		}
896ae771770SStanislav Sedov 		;
897ae771770SStanislav Sedov 
898ae771770SStanislav Sedov CharacterStringValue: STRING
899ae771770SStanislav Sedov 		{
900ae771770SStanislav Sedov 			$$ = emalloc(sizeof(*$$));
901ae771770SStanislav Sedov 			$$->type = stringvalue;
902ae771770SStanislav Sedov 			$$->u.stringvalue = $1;
903ae771770SStanislav Sedov 		}
904ae771770SStanislav Sedov 		;
905ae771770SStanislav Sedov 
906ae771770SStanislav Sedov BooleanValue	: kw_TRUE
907ae771770SStanislav Sedov 		{
908ae771770SStanislav Sedov 			$$ = emalloc(sizeof(*$$));
909ae771770SStanislav Sedov 			$$->type = booleanvalue;
910ae771770SStanislav Sedov 			$$->u.booleanvalue = 0;
911ae771770SStanislav Sedov 		}
912ae771770SStanislav Sedov 		| kw_FALSE
913ae771770SStanislav Sedov 		{
914ae771770SStanislav Sedov 			$$ = emalloc(sizeof(*$$));
915ae771770SStanislav Sedov 			$$->type = booleanvalue;
916ae771770SStanislav Sedov 			$$->u.booleanvalue = 0;
917ae771770SStanislav Sedov 		}
918ae771770SStanislav Sedov 		;
919ae771770SStanislav Sedov 
920ae771770SStanislav Sedov IntegerValue	: SignedNumber
921ae771770SStanislav Sedov 		{
922ae771770SStanislav Sedov 			$$ = emalloc(sizeof(*$$));
923ae771770SStanislav Sedov 			$$->type = integervalue;
924ae771770SStanislav Sedov 			$$->u.integervalue = $1;
925ae771770SStanislav Sedov 		}
926ae771770SStanislav Sedov 		;
927ae771770SStanislav Sedov 
928ae771770SStanislav Sedov SignedNumber	: NUMBER
929ae771770SStanislav Sedov 		;
930ae771770SStanislav Sedov 
931ae771770SStanislav Sedov NullValue	: kw_NULL
932ae771770SStanislav Sedov 		{
933ae771770SStanislav Sedov 		}
934ae771770SStanislav Sedov 		;
935ae771770SStanislav Sedov 
936ae771770SStanislav Sedov ObjectIdentifierValue: objid
937ae771770SStanislav Sedov 		{
938ae771770SStanislav Sedov 			$$ = emalloc(sizeof(*$$));
939ae771770SStanislav Sedov 			$$->type = objectidentifiervalue;
940ae771770SStanislav Sedov 			$$->u.objectidentifiervalue = $1;
941ae771770SStanislav Sedov 		}
942ae771770SStanislav Sedov 		;
943ae771770SStanislav Sedov 
944ae771770SStanislav Sedov %%
945ae771770SStanislav Sedov 
946ae771770SStanislav Sedov void
947ae771770SStanislav Sedov yyerror (const char *s)
948ae771770SStanislav Sedov {
949ae771770SStanislav Sedov      lex_error_message ("%s\n", s);
950ae771770SStanislav Sedov }
951ae771770SStanislav Sedov 
952ae771770SStanislav Sedov static Type *
new_tag(int tagclass,int tagvalue,int tagenv,Type * oldtype)953ae771770SStanislav Sedov new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype)
954ae771770SStanislav Sedov {
955ae771770SStanislav Sedov     Type *t;
956ae771770SStanislav Sedov     if(oldtype->type == TTag && oldtype->tag.tagenv == TE_IMPLICIT) {
957ae771770SStanislav Sedov 	t = oldtype;
958ae771770SStanislav Sedov 	oldtype = oldtype->subtype; /* XXX */
959ae771770SStanislav Sedov     } else
960ae771770SStanislav Sedov 	t = new_type (TTag);
961ae771770SStanislav Sedov 
962ae771770SStanislav Sedov     t->tag.tagclass = tagclass;
963ae771770SStanislav Sedov     t->tag.tagvalue = tagvalue;
964ae771770SStanislav Sedov     t->tag.tagenv = tagenv;
965ae771770SStanislav Sedov     t->subtype = oldtype;
966ae771770SStanislav Sedov     return t;
967ae771770SStanislav Sedov }
968ae771770SStanislav Sedov 
969ae771770SStanislav Sedov static struct objid *
new_objid(const char * label,int value)970ae771770SStanislav Sedov new_objid(const char *label, int value)
971ae771770SStanislav Sedov {
972ae771770SStanislav Sedov     struct objid *s;
973ae771770SStanislav Sedov     s = emalloc(sizeof(*s));
974ae771770SStanislav Sedov     s->label = label;
975ae771770SStanislav Sedov     s->value = value;
976ae771770SStanislav Sedov     s->next = NULL;
977ae771770SStanislav Sedov     return s;
978ae771770SStanislav Sedov }
979ae771770SStanislav Sedov 
980ae771770SStanislav Sedov static void
add_oid_to_tail(struct objid * head,struct objid * tail)981ae771770SStanislav Sedov add_oid_to_tail(struct objid *head, struct objid *tail)
982ae771770SStanislav Sedov {
983ae771770SStanislav Sedov     struct objid *o;
984ae771770SStanislav Sedov     o = head;
985ae771770SStanislav Sedov     while (o->next)
986ae771770SStanislav Sedov 	o = o->next;
987ae771770SStanislav Sedov     o->next = tail;
988ae771770SStanislav Sedov }
989ae771770SStanislav Sedov 
990ae771770SStanislav Sedov static Type *
new_type(Typetype tt)991ae771770SStanislav Sedov new_type (Typetype tt)
992ae771770SStanislav Sedov {
993ae771770SStanislav Sedov     Type *t = ecalloc(1, sizeof(*t));
994ae771770SStanislav Sedov     t->type = tt;
995ae771770SStanislav Sedov     return t;
996ae771770SStanislav Sedov }
997ae771770SStanislav Sedov 
998ae771770SStanislav Sedov static struct constraint_spec *
new_constraint_spec(enum ctype ct)999ae771770SStanislav Sedov new_constraint_spec(enum ctype ct)
1000ae771770SStanislav Sedov {
1001ae771770SStanislav Sedov     struct constraint_spec *c = ecalloc(1, sizeof(*c));
1002ae771770SStanislav Sedov     c->ctype = ct;
1003ae771770SStanislav Sedov     return c;
1004ae771770SStanislav Sedov }
1005ae771770SStanislav Sedov 
1006ae771770SStanislav Sedov static void fix_labels2(Type *t, const char *prefix);
fix_labels1(struct memhead * members,const char * prefix)1007ae771770SStanislav Sedov static void fix_labels1(struct memhead *members, const char *prefix)
1008ae771770SStanislav Sedov {
1009ae771770SStanislav Sedov     Member *m;
1010ae771770SStanislav Sedov 
1011ae771770SStanislav Sedov     if(members == NULL)
1012ae771770SStanislav Sedov 	return;
1013ae771770SStanislav Sedov     ASN1_TAILQ_FOREACH(m, members, members) {
1014ae771770SStanislav Sedov 	if (asprintf(&m->label, "%s_%s", prefix, m->gen_name) < 0)
1015ae771770SStanislav Sedov 	    errx(1, "malloc");
1016ae771770SStanislav Sedov 	if (m->label == NULL)
1017ae771770SStanislav Sedov 	    errx(1, "malloc");
1018ae771770SStanislav Sedov 	if(m->type != NULL)
1019ae771770SStanislav Sedov 	    fix_labels2(m->type, m->label);
1020ae771770SStanislav Sedov     }
1021ae771770SStanislav Sedov }
1022ae771770SStanislav Sedov 
fix_labels2(Type * t,const char * prefix)1023ae771770SStanislav Sedov static void fix_labels2(Type *t, const char *prefix)
1024ae771770SStanislav Sedov {
1025ae771770SStanislav Sedov     for(; t; t = t->subtype)
1026ae771770SStanislav Sedov 	fix_labels1(t->members, prefix);
1027ae771770SStanislav Sedov }
1028ae771770SStanislav Sedov 
1029ae771770SStanislav Sedov static void
fix_labels(Symbol * s)1030ae771770SStanislav Sedov fix_labels(Symbol *s)
1031ae771770SStanislav Sedov {
1032ae771770SStanislav Sedov     char *p = NULL;
1033ae771770SStanislav Sedov     if (asprintf(&p, "choice_%s", s->gen_name) < 0 || p == NULL)
1034ae771770SStanislav Sedov 	errx(1, "malloc");
1035ae771770SStanislav Sedov     fix_labels2(s->type, p);
1036ae771770SStanislav Sedov     free(p);
1037ae771770SStanislav Sedov }
1038