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