mirror of
https://github.com/samba-team/samba.git
synced 2025-01-25 06:04:04 +03:00
1583 lines
47 KiB
C
1583 lines
47 KiB
C
#ifndef lint
|
|
static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
|
|
#endif
|
|
|
|
#define YYBYACC 1
|
|
#define YYMAJOR 1
|
|
#define YYMINOR 9
|
|
#define YYPATCH 20101229
|
|
|
|
#define YYEMPTY (-1)
|
|
#define yyclearin (yychar = YYEMPTY)
|
|
#define yyerrok (yyerrflag = 0)
|
|
#define YYRECOVERING() (yyerrflag != 0)
|
|
|
|
#define YYPREFIX "yy"
|
|
|
|
#define YYPURE 0
|
|
|
|
|
|
#include <config.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "symbol.h"
|
|
#include "lex.h"
|
|
#include "gen_locl.h"
|
|
#include "der.h"
|
|
|
|
RCSID("$Id$");
|
|
|
|
static Type *new_type (Typetype t);
|
|
static struct constraint_spec *new_constraint_spec(enum ctype);
|
|
static Type *new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype);
|
|
void yyerror (const char *);
|
|
static struct objid *new_objid(const char *label, int value);
|
|
static void add_oid_to_tail(struct objid *, struct objid *);
|
|
static void fix_labels(Symbol *s);
|
|
|
|
struct string_list {
|
|
char *string;
|
|
struct string_list *next;
|
|
};
|
|
|
|
/* Declarations for Bison */
|
|
#define YYMALLOC malloc
|
|
#define YYFREE free
|
|
|
|
#ifdef YYSTYPE
|
|
#undef YYSTYPE_IS_DECLARED
|
|
#define YYSTYPE_IS_DECLARED 1
|
|
#endif
|
|
#ifndef YYSTYPE_IS_DECLARED
|
|
#define YYSTYPE_IS_DECLARED 1
|
|
typedef union {
|
|
int constant;
|
|
struct value *value;
|
|
struct range *range;
|
|
char *name;
|
|
Type *type;
|
|
Member *member;
|
|
struct objid *objid;
|
|
char *defval;
|
|
struct string_list *sl;
|
|
struct tagtype tag;
|
|
struct memhead *members;
|
|
struct constraint_spec *constraint_spec;
|
|
} YYSTYPE;
|
|
#endif /* !YYSTYPE_IS_DECLARED */
|
|
/* compatibility with bison */
|
|
#ifdef YYPARSE_PARAM
|
|
/* compatibility with FreeBSD */
|
|
# ifdef YYPARSE_PARAM_TYPE
|
|
# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
|
|
# else
|
|
# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
|
|
# endif
|
|
#else
|
|
# define YYPARSE_DECL() yyparse(void)
|
|
#endif
|
|
|
|
/* Parameters sent to lex. */
|
|
#ifdef YYLEX_PARAM
|
|
# define YYLEX_DECL() yylex(void *YYLEX_PARAM)
|
|
# define YYLEX yylex(YYLEX_PARAM)
|
|
#else
|
|
# define YYLEX_DECL() yylex(void)
|
|
# define YYLEX yylex()
|
|
#endif
|
|
|
|
/* Parameters sent to yyerror. */
|
|
#define YYERROR_DECL() yyerror(const char *s)
|
|
#define YYERROR_CALL(msg) yyerror(msg)
|
|
|
|
extern int YYPARSE_DECL();
|
|
|
|
#define kw_ABSENT 257
|
|
#define kw_ABSTRACT_SYNTAX 258
|
|
#define kw_ALL 259
|
|
#define kw_APPLICATION 260
|
|
#define kw_AUTOMATIC 261
|
|
#define kw_BEGIN 262
|
|
#define kw_BIT 263
|
|
#define kw_BMPString 264
|
|
#define kw_BOOLEAN 265
|
|
#define kw_BY 266
|
|
#define kw_CHARACTER 267
|
|
#define kw_CHOICE 268
|
|
#define kw_CLASS 269
|
|
#define kw_COMPONENT 270
|
|
#define kw_COMPONENTS 271
|
|
#define kw_CONSTRAINED 272
|
|
#define kw_CONTAINING 273
|
|
#define kw_DEFAULT 274
|
|
#define kw_DEFINITIONS 275
|
|
#define kw_EMBEDDED 276
|
|
#define kw_ENCODED 277
|
|
#define kw_END 278
|
|
#define kw_ENUMERATED 279
|
|
#define kw_EXCEPT 280
|
|
#define kw_EXPLICIT 281
|
|
#define kw_EXPORTS 282
|
|
#define kw_EXTENSIBILITY 283
|
|
#define kw_EXTERNAL 284
|
|
#define kw_FALSE 285
|
|
#define kw_FROM 286
|
|
#define kw_GeneralString 287
|
|
#define kw_GeneralizedTime 288
|
|
#define kw_GraphicString 289
|
|
#define kw_IA5String 290
|
|
#define kw_IDENTIFIER 291
|
|
#define kw_IMPLICIT 292
|
|
#define kw_IMPLIED 293
|
|
#define kw_IMPORTS 294
|
|
#define kw_INCLUDES 295
|
|
#define kw_INSTANCE 296
|
|
#define kw_INTEGER 297
|
|
#define kw_INTERSECTION 298
|
|
#define kw_ISO646String 299
|
|
#define kw_MAX 300
|
|
#define kw_MIN 301
|
|
#define kw_MINUS_INFINITY 302
|
|
#define kw_NULL 303
|
|
#define kw_NumericString 304
|
|
#define kw_OBJECT 305
|
|
#define kw_OCTET 306
|
|
#define kw_OF 307
|
|
#define kw_OPTIONAL 308
|
|
#define kw_ObjectDescriptor 309
|
|
#define kw_PATTERN 310
|
|
#define kw_PDV 311
|
|
#define kw_PLUS_INFINITY 312
|
|
#define kw_PRESENT 313
|
|
#define kw_PRIVATE 314
|
|
#define kw_PrintableString 315
|
|
#define kw_REAL 316
|
|
#define kw_RELATIVE_OID 317
|
|
#define kw_SEQUENCE 318
|
|
#define kw_SET 319
|
|
#define kw_SIZE 320
|
|
#define kw_STRING 321
|
|
#define kw_SYNTAX 322
|
|
#define kw_T61String 323
|
|
#define kw_TAGS 324
|
|
#define kw_TRUE 325
|
|
#define kw_TYPE_IDENTIFIER 326
|
|
#define kw_TeletexString 327
|
|
#define kw_UNION 328
|
|
#define kw_UNIQUE 329
|
|
#define kw_UNIVERSAL 330
|
|
#define kw_UTCTime 331
|
|
#define kw_UTF8String 332
|
|
#define kw_UniversalString 333
|
|
#define kw_VideotexString 334
|
|
#define kw_VisibleString 335
|
|
#define kw_WITH 336
|
|
#define RANGE 337
|
|
#define EEQUAL 338
|
|
#define ELLIPSIS 339
|
|
#define IDENTIFIER 340
|
|
#define referencename 341
|
|
#define STRING 342
|
|
#define NUMBER 343
|
|
#define YYERRCODE 256
|
|
static const short yylhs[] = { -1,
|
|
0, 56, 56, 56, 56, 57, 57, 58, 58, 60,
|
|
60, 62, 62, 63, 63, 64, 59, 59, 59, 61,
|
|
61, 65, 65, 50, 50, 66, 14, 14, 14, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 15, 15, 17, 48, 48, 48, 48, 21, 21,
|
|
21, 43, 43, 43, 38, 20, 41, 16, 16, 32,
|
|
23, 22, 49, 49, 24, 24, 25, 26, 26, 27,
|
|
18, 29, 29, 30, 31, 31, 19, 51, 52, 53,
|
|
53, 54, 54, 54, 55, 28, 35, 2, 2, 2,
|
|
2, 3, 3, 3, 67, 33, 34, 34, 34, 34,
|
|
34, 34, 34, 34, 40, 40, 40, 39, 36, 36,
|
|
36, 42, 42, 37, 47, 47, 44, 45, 45, 46,
|
|
46, 46, 4, 4, 5, 5, 5, 5, 5, 12,
|
|
11, 13, 9, 7, 7, 6, 1, 10, 8,
|
|
};
|
|
static const short yylen[] = { 2,
|
|
9, 2, 2, 2, 0, 2, 0, 3, 0, 3,
|
|
0, 1, 0, 1, 2, 4, 3, 2, 0, 1,
|
|
2, 1, 1, 3, 1, 3, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 5, 5, 5, 3, 1, 2,
|
|
4, 1, 3, 3, 4, 4, 1, 2, 5, 2,
|
|
3, 1, 0, 2, 4, 3, 4, 4, 3, 3,
|
|
4, 1, 1, 1, 1, 1, 2, 3, 1, 1,
|
|
1, 2, 3, 5, 4, 3, 4, 0, 1, 1,
|
|
1, 0, 1, 1, 4, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 3, 3, 2, 1, 2,
|
|
3, 1, 3, 4, 1, 0, 3, 0, 2, 4,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
};
|
|
static const short yydefred[] = { 0,
|
|
0, 0, 0, 115, 0, 0, 122, 0, 0, 0,
|
|
0, 117, 119, 0, 0, 0, 0, 0, 4, 2,
|
|
3, 0, 0, 120, 6, 0, 0, 0, 0, 0,
|
|
18, 0, 0, 1, 0, 0, 0, 17, 0, 0,
|
|
0, 14, 0, 8, 0, 22, 23, 24, 0, 10,
|
|
15, 0, 103, 44, 0, 0, 97, 75, 102, 0,
|
|
62, 0, 0, 100, 0, 0, 98, 76, 99, 104,
|
|
101, 0, 74, 0, 0, 27, 30, 31, 33, 29,
|
|
34, 35, 36, 38, 39, 40, 41, 42, 43, 28,
|
|
72, 73, 37, 32, 96, 0, 21, 0, 0, 0,
|
|
0, 0, 0, 50, 60, 0, 0, 0, 0, 0,
|
|
0, 0, 90, 91, 89, 0, 0, 0, 77, 93,
|
|
94, 0, 16, 0, 0, 105, 0, 0, 0, 52,
|
|
0, 0, 135, 0, 138, 134, 132, 133, 137, 136,
|
|
0, 123, 127, 125, 128, 126, 129, 130, 124, 131,
|
|
139, 0, 61, 64, 66, 0, 0, 0, 69, 0,
|
|
0, 95, 0, 0, 0, 0, 79, 80, 81, 0,
|
|
0, 112, 0, 0, 0, 110, 0, 71, 0, 56,
|
|
0, 0, 0, 48, 51, 65, 0, 68, 87, 0,
|
|
0, 0, 78, 0, 0, 59, 111, 107, 106, 0,
|
|
54, 53, 0, 0, 0, 0, 0, 83, 0, 113,
|
|
55, 47, 46, 45, 85, 0, 114, 84,
|
|
};
|
|
static const short yydgoto[] = { 2,
|
|
140, 116, 122, 141, 142, 143, 144, 145, 146, 147,
|
|
148, 149, 150, 75, 76, 77, 78, 79, 80, 81,
|
|
82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
|
|
92, 93, 94, 95, 96, 126, 172, 130, 127, 128,
|
|
131, 173, 132, 151, 8, 9, 5, 104, 109, 39,
|
|
119, 166, 167, 168, 169, 17, 23, 29, 30, 36,
|
|
44, 40, 41, 42, 45, 46, 47,
|
|
};
|
|
static const short yysindex[] = { -295,
|
|
-74, 0, -289, 0, -216, 23, 0, -61, -289, -221,
|
|
-277, 0, 0, -259, -257, -256, -214, 31, 0, 0,
|
|
0, -220, -264, 0, 0, -187, -206, -232, -201, -213,
|
|
0, 34, 25, 0, -258, -251, -258, 0, -188, 40,
|
|
-258, 0, 63, 0, -251, 0, 0, 0, -239, 0,
|
|
0, -218, 0, 0, -19, -17, 0, 0, 0, -12,
|
|
0, -184, -212, 0, -106, -111, 0, 0, 0, 0,
|
|
0, 112, 0, -228, -37, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, -242, 0, -74, -10, -223,
|
|
-215, -116, -215, 0, 0, -198, 87, -105, -179, 112,
|
|
-100, 89, 0, 0, 0, -211, -4, -225, 0, 0,
|
|
0, 112, 0, -210, 112, 0, -238, -13, 91, 0,
|
|
9, 92, 0, -202, 0, 0, 0, 0, 0, 0,
|
|
-33, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, -11, 0, 0, 0, -9, 112, 89, 0, -7,
|
|
44, 0, -128, 112, -127, 99, 0, 0, 0, 89,
|
|
101, 0, -2, 89, -4, 0, -283, 0, -200, 0,
|
|
-278, -4, -8, 0, 0, 0, 89, 0, 0, 19,
|
|
-27, -4, 0, -199, -210, 0, 0, 0, 0, 104,
|
|
0, 0, 105, 106, 107, 24, -115, 0, 109, 0,
|
|
0, 0, 0, 0, 0, -4, 0, 0,
|
|
};
|
|
static const short yyrindex[] = { 0,
|
|
-123, 0, 28, 0, 0, -110, 0, 0, 28, -245,
|
|
0, 0, 0, 0, 0, 0, -183, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, -248, 0, 0, -182,
|
|
0, -41, 0, 0, 97, 0, 0, 0, 0, 0,
|
|
98, 0, 0, 0, -119, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, -30,
|
|
0, 0, 0, 0, -147, 0, 0, 0, 0, 0,
|
|
0, 0, 0, -181, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 169, 0, -49, -40, 0,
|
|
0, 0, 0, 0, 0, -35, 0, 0, 0, 0,
|
|
0, -244, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
|
|
0, 36, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, -25, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, -20,
|
|
0, 0, 0, -42, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, -15, 0, 0, 0,
|
|
122, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
};
|
|
static const short yygindex[] = { 0,
|
|
-14, 0, 0, -95, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, -31, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, -6, -29, -5, 0, -53,
|
|
0, 0, 61, 22, 158, 0, 70, 65, 64, 16,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
128, 0, 0, 133, 0, 0, 0,
|
|
};
|
|
#define YYTABLESIZE 509
|
|
static const short yytable[] = { 58,
|
|
58, 108, 118, 58, 63, 63, 3, 184, 63, 116,
|
|
49, 111, 118, 49, 121, 70, 108, 25, 70, 155,
|
|
86, 162, 4, 86, 159, 67, 31, 102, 67, 9,
|
|
177, 113, 181, 26, 177, 175, 177, 5, 120, 14,
|
|
112, 195, 109, 33, 1, 19, 163, 164, 3, 121,
|
|
6, 165, 48, 7, 156, 198, 125, 160, 10, 15,
|
|
201, 129, 11, 12, 19, 18, 20, 21, 22, 176,
|
|
16, 24, 25, 26, 27, 28, 34, 37, 158, 197,
|
|
35, 32, 108, 38, 58, 114, 203, 205, 43, 63,
|
|
170, 19, 5, 174, 49, 26, 208, 49, 50, 70,
|
|
98, 115, 99, 100, 86, 101, 105, 32, 106, 67,
|
|
103, 178, 124, 185, 3, 186, 125, 188, 3, 4,
|
|
218, 107, 196, 109, 129, 187, 102, 157, 118, 171,
|
|
179, 161, 191, 180, 182, 181, 189, 190, 192, 193,
|
|
194, 206, 139, 209, 211, 212, 213, 214, 215, 217,
|
|
216, 116, 118, 74, 7, 13, 12, 11, 20, 63,
|
|
57, 88, 82, 152, 200, 210, 13, 123, 133, 153,
|
|
199, 154, 97, 51, 0, 202, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 134, 0, 135, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 110, 0, 0, 0, 0,
|
|
0, 0, 74, 0, 0, 0, 0, 0, 136, 0,
|
|
0, 0, 0, 107, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 137, 0, 138, 139, 0, 0, 121,
|
|
0, 108, 121, 58, 125, 0, 58, 58, 63, 125,
|
|
0, 63, 63, 49, 25, 0, 49, 49, 70, 207,
|
|
0, 70, 70, 86, 0, 0, 86, 86, 67, 92,
|
|
0, 67, 67, 0, 0, 108, 0, 58, 0, 0,
|
|
0, 0, 63, 0, 0, 0, 133, 49, 0, 0,
|
|
133, 0, 70, 0, 0, 0, 0, 86, 0, 0,
|
|
116, 204, 67, 0, 135, 0, 0, 58, 135, 58,
|
|
117, 0, 63, 183, 63, 0, 0, 49, 0, 49,
|
|
0, 0, 70, 0, 70, 0, 136, 86, 0, 86,
|
|
136, 0, 67, 0, 67, 52, 53, 54, 0, 0,
|
|
55, 137, 0, 138, 139, 137, 0, 138, 139, 0,
|
|
0, 56, 0, 0, 0, 0, 0, 0, 0, 57,
|
|
58, 0, 59, 0, 0, 0, 0, 0, 0, 60,
|
|
0, 0, 0, 0, 0, 61, 0, 62, 63, 0,
|
|
0, 0, 0, 0, 52, 53, 54, 64, 0, 55,
|
|
65, 66, 0, 0, 0, 0, 0, 0, 0, 67,
|
|
56, 0, 0, 68, 69, 70, 0, 71, 57, 58,
|
|
72, 59, 73, 0, 0, 0, 0, 0, 60, 0,
|
|
0, 0, 0, 0, 61, 0, 62, 63, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 64, 0, 0, 65,
|
|
66, 92, 92, 92, 0, 0, 92, 0, 67, 0,
|
|
0, 0, 68, 69, 70, 0, 71, 92, 0, 0,
|
|
0, 73, 0, 0, 0, 92, 92, 0, 92, 0,
|
|
0, 0, 0, 0, 0, 92, 0, 0, 0, 0,
|
|
0, 92, 0, 92, 92, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 92, 0, 0, 92, 92, 0, 0,
|
|
0, 0, 0, 0, 0, 92, 0, 0, 0, 92,
|
|
92, 92, 0, 92, 0, 0, 0, 0, 92,
|
|
};
|
|
static const short yycheck[] = { 40,
|
|
41, 44, 40, 44, 40, 41, 123, 41, 44, 59,
|
|
41, 123, 40, 44, 125, 41, 123, 59, 44, 125,
|
|
41, 117, 1, 44, 125, 41, 259, 40, 44, 278,
|
|
44, 260, 44, 278, 44, 274, 44, 283, 281, 261,
|
|
72, 44, 44, 28, 340, 294, 272, 273, 123, 292,
|
|
340, 277, 37, 343, 108, 339, 340, 111, 275, 281,
|
|
339, 340, 40, 125, 324, 343, 324, 324, 283, 308,
|
|
292, 41, 293, 338, 262, 282, 278, 44, 110, 175,
|
|
294, 340, 125, 59, 125, 314, 182, 183, 340, 125,
|
|
122, 340, 338, 125, 125, 340, 192, 286, 59, 125,
|
|
340, 330, 321, 123, 125, 123, 291, 340, 321, 125,
|
|
123, 125, 123, 125, 123, 125, 340, 125, 123, 98,
|
|
216, 320, 125, 125, 340, 157, 40, 307, 40, 340,
|
|
40, 343, 164, 125, 337, 44, 93, 266, 266, 41,
|
|
40, 123, 343, 343, 41, 41, 41, 41, 125, 41,
|
|
266, 275, 125, 91, 338, 59, 59, 340, 278, 307,
|
|
125, 343, 41, 103, 179, 195, 9, 98, 285, 106,
|
|
177, 107, 45, 41, -1, 181, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, 301, -1, 303, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, 307, -1, -1, -1, -1,
|
|
-1, -1, 91, -1, -1, -1, -1, -1, 325, -1,
|
|
-1, -1, -1, 320, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, 340, -1, 342, 343, -1, -1, 340,
|
|
-1, 274, 343, 274, 340, -1, 277, 278, 274, 340,
|
|
-1, 277, 278, 274, 286, -1, 277, 278, 274, 277,
|
|
-1, 277, 278, 274, -1, -1, 277, 278, 274, 91,
|
|
-1, 277, 278, -1, -1, 308, -1, 308, -1, -1,
|
|
-1, -1, 308, -1, -1, -1, 285, 308, -1, -1,
|
|
285, -1, 308, -1, -1, -1, -1, 308, -1, -1,
|
|
340, 300, 308, -1, 303, -1, -1, 338, 303, 340,
|
|
338, -1, 338, 337, 340, -1, -1, 338, -1, 340,
|
|
-1, -1, 338, -1, 340, -1, 325, 338, -1, 340,
|
|
325, -1, 338, -1, 340, 263, 264, 265, -1, -1,
|
|
268, 340, -1, 342, 343, 340, -1, 342, 343, -1,
|
|
-1, 279, -1, -1, -1, -1, -1, -1, -1, 287,
|
|
288, -1, 290, -1, -1, -1, -1, -1, -1, 297,
|
|
-1, -1, -1, -1, -1, 303, -1, 305, 306, -1,
|
|
-1, -1, -1, -1, 263, 264, 265, 315, -1, 268,
|
|
318, 319, -1, -1, -1, -1, -1, -1, -1, 327,
|
|
279, -1, -1, 331, 332, 333, -1, 335, 287, 288,
|
|
338, 290, 340, -1, -1, -1, -1, -1, 297, -1,
|
|
-1, -1, -1, -1, 303, -1, 305, 306, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, 315, -1, -1, 318,
|
|
319, 263, 264, 265, -1, -1, 268, -1, 327, -1,
|
|
-1, -1, 331, 332, 333, -1, 335, 279, -1, -1,
|
|
-1, 340, -1, -1, -1, 287, 288, -1, 290, -1,
|
|
-1, -1, -1, -1, -1, 297, -1, -1, -1, -1,
|
|
-1, 303, -1, 305, 306, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, 315, -1, -1, 318, 319, -1, -1,
|
|
-1, -1, -1, -1, -1, 327, -1, -1, -1, 331,
|
|
332, 333, -1, 335, -1, -1, -1, -1, 340,
|
|
};
|
|
#define YYFINAL 2
|
|
#ifndef YYDEBUG
|
|
#define YYDEBUG 0
|
|
#endif
|
|
#define YYMAXTOKEN 343
|
|
#if YYDEBUG
|
|
static const char *yyname[] = {
|
|
|
|
"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,"'('","')'",0,0,"','",0,0,0,0,0,0,0,0,0,0,0,0,0,0,"';'",0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'['",0,"']'",0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'{'",0,"'}'",0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
"kw_ABSENT","kw_ABSTRACT_SYNTAX","kw_ALL","kw_APPLICATION","kw_AUTOMATIC",
|
|
"kw_BEGIN","kw_BIT","kw_BMPString","kw_BOOLEAN","kw_BY","kw_CHARACTER",
|
|
"kw_CHOICE","kw_CLASS","kw_COMPONENT","kw_COMPONENTS","kw_CONSTRAINED",
|
|
"kw_CONTAINING","kw_DEFAULT","kw_DEFINITIONS","kw_EMBEDDED","kw_ENCODED",
|
|
"kw_END","kw_ENUMERATED","kw_EXCEPT","kw_EXPLICIT","kw_EXPORTS",
|
|
"kw_EXTENSIBILITY","kw_EXTERNAL","kw_FALSE","kw_FROM","kw_GeneralString",
|
|
"kw_GeneralizedTime","kw_GraphicString","kw_IA5String","kw_IDENTIFIER",
|
|
"kw_IMPLICIT","kw_IMPLIED","kw_IMPORTS","kw_INCLUDES","kw_INSTANCE",
|
|
"kw_INTEGER","kw_INTERSECTION","kw_ISO646String","kw_MAX","kw_MIN",
|
|
"kw_MINUS_INFINITY","kw_NULL","kw_NumericString","kw_OBJECT","kw_OCTET","kw_OF",
|
|
"kw_OPTIONAL","kw_ObjectDescriptor","kw_PATTERN","kw_PDV","kw_PLUS_INFINITY",
|
|
"kw_PRESENT","kw_PRIVATE","kw_PrintableString","kw_REAL","kw_RELATIVE_OID",
|
|
"kw_SEQUENCE","kw_SET","kw_SIZE","kw_STRING","kw_SYNTAX","kw_T61String",
|
|
"kw_TAGS","kw_TRUE","kw_TYPE_IDENTIFIER","kw_TeletexString","kw_UNION",
|
|
"kw_UNIQUE","kw_UNIVERSAL","kw_UTCTime","kw_UTF8String","kw_UniversalString",
|
|
"kw_VideotexString","kw_VisibleString","kw_WITH","RANGE","EEQUAL","ELLIPSIS",
|
|
"IDENTIFIER","referencename","STRING","NUMBER",
|
|
};
|
|
static const char *yyrule[] = {
|
|
"$accept : ModuleDefinition",
|
|
"ModuleDefinition : IDENTIFIER objid_opt kw_DEFINITIONS TagDefault ExtensionDefault EEQUAL kw_BEGIN ModuleBody kw_END",
|
|
"TagDefault : kw_EXPLICIT kw_TAGS",
|
|
"TagDefault : kw_IMPLICIT kw_TAGS",
|
|
"TagDefault : kw_AUTOMATIC kw_TAGS",
|
|
"TagDefault :",
|
|
"ExtensionDefault : kw_EXTENSIBILITY kw_IMPLIED",
|
|
"ExtensionDefault :",
|
|
"ModuleBody : Exports Imports AssignmentList",
|
|
"ModuleBody :",
|
|
"Imports : kw_IMPORTS SymbolsImported ';'",
|
|
"Imports :",
|
|
"SymbolsImported : SymbolsFromModuleList",
|
|
"SymbolsImported :",
|
|
"SymbolsFromModuleList : SymbolsFromModule",
|
|
"SymbolsFromModuleList : SymbolsFromModuleList SymbolsFromModule",
|
|
"SymbolsFromModule : referencenames kw_FROM IDENTIFIER objid_opt",
|
|
"Exports : kw_EXPORTS referencenames ';'",
|
|
"Exports : kw_EXPORTS kw_ALL",
|
|
"Exports :",
|
|
"AssignmentList : Assignment",
|
|
"AssignmentList : Assignment AssignmentList",
|
|
"Assignment : TypeAssignment",
|
|
"Assignment : ValueAssignment",
|
|
"referencenames : IDENTIFIER ',' referencenames",
|
|
"referencenames : IDENTIFIER",
|
|
"TypeAssignment : IDENTIFIER EEQUAL Type",
|
|
"Type : BuiltinType",
|
|
"Type : ReferencedType",
|
|
"Type : ConstrainedType",
|
|
"BuiltinType : BitStringType",
|
|
"BuiltinType : BooleanType",
|
|
"BuiltinType : CharacterStringType",
|
|
"BuiltinType : ChoiceType",
|
|
"BuiltinType : EnumeratedType",
|
|
"BuiltinType : IntegerType",
|
|
"BuiltinType : NullType",
|
|
"BuiltinType : ObjectIdentifierType",
|
|
"BuiltinType : OctetStringType",
|
|
"BuiltinType : SequenceType",
|
|
"BuiltinType : SequenceOfType",
|
|
"BuiltinType : SetType",
|
|
"BuiltinType : SetOfType",
|
|
"BuiltinType : TaggedType",
|
|
"BooleanType : kw_BOOLEAN",
|
|
"range : '(' Value RANGE Value ')'",
|
|
"range : '(' Value RANGE kw_MAX ')'",
|
|
"range : '(' kw_MIN RANGE Value ')'",
|
|
"range : '(' Value ')'",
|
|
"IntegerType : kw_INTEGER",
|
|
"IntegerType : kw_INTEGER range",
|
|
"IntegerType : kw_INTEGER '{' NamedNumberList '}'",
|
|
"NamedNumberList : NamedNumber",
|
|
"NamedNumberList : NamedNumberList ',' NamedNumber",
|
|
"NamedNumberList : NamedNumberList ',' ELLIPSIS",
|
|
"NamedNumber : IDENTIFIER '(' SignedNumber ')'",
|
|
"EnumeratedType : kw_ENUMERATED '{' Enumerations '}'",
|
|
"Enumerations : NamedNumberList",
|
|
"BitStringType : kw_BIT kw_STRING",
|
|
"BitStringType : kw_BIT kw_STRING '{' NamedBitList '}'",
|
|
"ObjectIdentifierType : kw_OBJECT kw_IDENTIFIER",
|
|
"OctetStringType : kw_OCTET kw_STRING size",
|
|
"NullType : kw_NULL",
|
|
"size :",
|
|
"size : kw_SIZE range",
|
|
"SequenceType : kw_SEQUENCE '{' ComponentTypeList '}'",
|
|
"SequenceType : kw_SEQUENCE '{' '}'",
|
|
"SequenceOfType : kw_SEQUENCE size kw_OF Type",
|
|
"SetType : kw_SET '{' ComponentTypeList '}'",
|
|
"SetType : kw_SET '{' '}'",
|
|
"SetOfType : kw_SET kw_OF Type",
|
|
"ChoiceType : kw_CHOICE '{' ComponentTypeList '}'",
|
|
"ReferencedType : DefinedType",
|
|
"ReferencedType : UsefulType",
|
|
"DefinedType : IDENTIFIER",
|
|
"UsefulType : kw_GeneralizedTime",
|
|
"UsefulType : kw_UTCTime",
|
|
"ConstrainedType : Type Constraint",
|
|
"Constraint : '(' ConstraintSpec ')'",
|
|
"ConstraintSpec : GeneralConstraint",
|
|
"GeneralConstraint : ContentsConstraint",
|
|
"GeneralConstraint : UserDefinedConstraint",
|
|
"ContentsConstraint : kw_CONTAINING Type",
|
|
"ContentsConstraint : kw_ENCODED kw_BY Value",
|
|
"ContentsConstraint : kw_CONTAINING Type kw_ENCODED kw_BY Value",
|
|
"UserDefinedConstraint : kw_CONSTRAINED kw_BY '{' '}'",
|
|
"TaggedType : Tag tagenv Type",
|
|
"Tag : '[' Class NUMBER ']'",
|
|
"Class :",
|
|
"Class : kw_UNIVERSAL",
|
|
"Class : kw_APPLICATION",
|
|
"Class : kw_PRIVATE",
|
|
"tagenv :",
|
|
"tagenv : kw_EXPLICIT",
|
|
"tagenv : kw_IMPLICIT",
|
|
"ValueAssignment : IDENTIFIER Type EEQUAL Value",
|
|
"CharacterStringType : RestrictedCharactedStringType",
|
|
"RestrictedCharactedStringType : kw_GeneralString",
|
|
"RestrictedCharactedStringType : kw_TeletexString",
|
|
"RestrictedCharactedStringType : kw_UTF8String",
|
|
"RestrictedCharactedStringType : kw_PrintableString",
|
|
"RestrictedCharactedStringType : kw_VisibleString",
|
|
"RestrictedCharactedStringType : kw_IA5String",
|
|
"RestrictedCharactedStringType : kw_BMPString",
|
|
"RestrictedCharactedStringType : kw_UniversalString",
|
|
"ComponentTypeList : ComponentType",
|
|
"ComponentTypeList : ComponentTypeList ',' ComponentType",
|
|
"ComponentTypeList : ComponentTypeList ',' ELLIPSIS",
|
|
"NamedType : IDENTIFIER Type",
|
|
"ComponentType : NamedType",
|
|
"ComponentType : NamedType kw_OPTIONAL",
|
|
"ComponentType : NamedType kw_DEFAULT Value",
|
|
"NamedBitList : NamedBit",
|
|
"NamedBitList : NamedBitList ',' NamedBit",
|
|
"NamedBit : IDENTIFIER '(' NUMBER ')'",
|
|
"objid_opt : objid",
|
|
"objid_opt :",
|
|
"objid : '{' objid_list '}'",
|
|
"objid_list :",
|
|
"objid_list : objid_element objid_list",
|
|
"objid_element : IDENTIFIER '(' NUMBER ')'",
|
|
"objid_element : IDENTIFIER",
|
|
"objid_element : NUMBER",
|
|
"Value : BuiltinValue",
|
|
"Value : ReferencedValue",
|
|
"BuiltinValue : BooleanValue",
|
|
"BuiltinValue : CharacterStringValue",
|
|
"BuiltinValue : IntegerValue",
|
|
"BuiltinValue : ObjectIdentifierValue",
|
|
"BuiltinValue : NullValue",
|
|
"ReferencedValue : DefinedValue",
|
|
"DefinedValue : Valuereference",
|
|
"Valuereference : IDENTIFIER",
|
|
"CharacterStringValue : STRING",
|
|
"BooleanValue : kw_TRUE",
|
|
"BooleanValue : kw_FALSE",
|
|
"IntegerValue : SignedNumber",
|
|
"SignedNumber : NUMBER",
|
|
"NullValue : kw_NULL",
|
|
"ObjectIdentifierValue : objid",
|
|
|
|
};
|
|
#endif
|
|
/* define the initial stack-sizes */
|
|
#ifdef YYSTACKSIZE
|
|
#undef YYMAXDEPTH
|
|
#define YYMAXDEPTH YYSTACKSIZE
|
|
#else
|
|
#ifdef YYMAXDEPTH
|
|
#define YYSTACKSIZE YYMAXDEPTH
|
|
#else
|
|
#define YYSTACKSIZE 500
|
|
#define YYMAXDEPTH 500
|
|
#endif
|
|
#endif
|
|
|
|
#define YYINITSTACKSIZE 500
|
|
|
|
int yydebug;
|
|
int yynerrs;
|
|
|
|
typedef struct {
|
|
unsigned stacksize;
|
|
short *s_base;
|
|
short *s_mark;
|
|
short *s_last;
|
|
YYSTYPE *l_base;
|
|
YYSTYPE *l_mark;
|
|
} YYSTACKDATA;
|
|
int yyerrflag;
|
|
int yychar;
|
|
YYSTYPE yyval;
|
|
YYSTYPE yylval;
|
|
|
|
/* variables for the parser stack */
|
|
static YYSTACKDATA yystack;
|
|
|
|
void
|
|
yyerror (const char *s)
|
|
{
|
|
lex_error_message ("%s\n", s);
|
|
}
|
|
|
|
static Type *
|
|
new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype)
|
|
{
|
|
Type *t;
|
|
if(oldtype->type == TTag && oldtype->tag.tagenv == TE_IMPLICIT) {
|
|
t = oldtype;
|
|
oldtype = oldtype->subtype; /* XXX */
|
|
} else
|
|
t = new_type (TTag);
|
|
|
|
t->tag.tagclass = tagclass;
|
|
t->tag.tagvalue = tagvalue;
|
|
t->tag.tagenv = tagenv;
|
|
t->subtype = oldtype;
|
|
return t;
|
|
}
|
|
|
|
static struct objid *
|
|
new_objid(const char *label, int value)
|
|
{
|
|
struct objid *s;
|
|
s = emalloc(sizeof(*s));
|
|
s->label = label;
|
|
s->value = value;
|
|
s->next = NULL;
|
|
return s;
|
|
}
|
|
|
|
static void
|
|
add_oid_to_tail(struct objid *head, struct objid *tail)
|
|
{
|
|
struct objid *o;
|
|
o = head;
|
|
while (o->next)
|
|
o = o->next;
|
|
o->next = tail;
|
|
}
|
|
|
|
static Type *
|
|
new_type (Typetype tt)
|
|
{
|
|
Type *t = ecalloc(1, sizeof(*t));
|
|
t->type = tt;
|
|
return t;
|
|
}
|
|
|
|
static struct constraint_spec *
|
|
new_constraint_spec(enum ctype ct)
|
|
{
|
|
struct constraint_spec *c = ecalloc(1, sizeof(*c));
|
|
c->ctype = ct;
|
|
return c;
|
|
}
|
|
|
|
static void fix_labels2(Type *t, const char *prefix);
|
|
static void fix_labels1(struct memhead *members, const char *prefix)
|
|
{
|
|
Member *m;
|
|
|
|
if(members == NULL)
|
|
return;
|
|
ASN1_TAILQ_FOREACH(m, members, members) {
|
|
if (asprintf(&m->label, "%s_%s", prefix, m->gen_name) < 0)
|
|
errx(1, "malloc");
|
|
if (m->label == NULL)
|
|
errx(1, "malloc");
|
|
if(m->type != NULL)
|
|
fix_labels2(m->type, m->label);
|
|
}
|
|
}
|
|
|
|
static void fix_labels2(Type *t, const char *prefix)
|
|
{
|
|
for(; t; t = t->subtype)
|
|
fix_labels1(t->members, prefix);
|
|
}
|
|
|
|
static void
|
|
fix_labels(Symbol *s)
|
|
{
|
|
char *p = NULL;
|
|
if (asprintf(&p, "choice_%s", s->gen_name) < 0 || p == NULL)
|
|
errx(1, "malloc");
|
|
fix_labels2(s->type, p);
|
|
free(p);
|
|
}
|
|
|
|
#if YYDEBUG
|
|
#include <stdio.h> /* needed for printf */
|
|
#endif
|
|
|
|
#include <stdlib.h> /* needed for malloc, etc */
|
|
#include <string.h> /* needed for memset */
|
|
|
|
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
|
|
static int yygrowstack(YYSTACKDATA *data)
|
|
{
|
|
int i;
|
|
unsigned newsize;
|
|
short *newss;
|
|
YYSTYPE *newvs;
|
|
|
|
if ((newsize = data->stacksize) == 0)
|
|
newsize = YYINITSTACKSIZE;
|
|
else if (newsize >= YYMAXDEPTH)
|
|
return -1;
|
|
else if ((newsize *= 2) > YYMAXDEPTH)
|
|
newsize = YYMAXDEPTH;
|
|
|
|
i = data->s_mark - data->s_base;
|
|
newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));
|
|
if (newss == 0)
|
|
return -1;
|
|
|
|
data->s_base = newss;
|
|
data->s_mark = newss + i;
|
|
|
|
newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
|
|
if (newvs == 0)
|
|
return -1;
|
|
|
|
data->l_base = newvs;
|
|
data->l_mark = newvs + i;
|
|
|
|
data->stacksize = newsize;
|
|
data->s_last = data->s_base + newsize - 1;
|
|
return 0;
|
|
}
|
|
|
|
#if YYPURE || defined(YY_NO_LEAKS)
|
|
static void yyfreestack(YYSTACKDATA *data)
|
|
{
|
|
free(data->s_base);
|
|
free(data->l_base);
|
|
memset(data, 0, sizeof(*data));
|
|
}
|
|
#else
|
|
#define yyfreestack(data) /* nothing */
|
|
#endif
|
|
|
|
#define YYABORT goto yyabort
|
|
#define YYREJECT goto yyabort
|
|
#define YYACCEPT goto yyaccept
|
|
#define YYERROR goto yyerrlab
|
|
|
|
int
|
|
YYPARSE_DECL()
|
|
{
|
|
int yym, yyn, yystate;
|
|
#if YYDEBUG
|
|
const char *yys;
|
|
|
|
if ((yys = getenv("YYDEBUG")) != 0)
|
|
{
|
|
yyn = *yys;
|
|
if (yyn >= '0' && yyn <= '9')
|
|
yydebug = yyn - '0';
|
|
}
|
|
#endif
|
|
|
|
yynerrs = 0;
|
|
yyerrflag = 0;
|
|
yychar = YYEMPTY;
|
|
yystate = 0;
|
|
|
|
#if YYPURE
|
|
memset(&yystack, 0, sizeof(yystack));
|
|
#endif
|
|
|
|
if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
|
|
yystack.s_mark = yystack.s_base;
|
|
yystack.l_mark = yystack.l_base;
|
|
yystate = 0;
|
|
*yystack.s_mark = 0;
|
|
|
|
yyloop:
|
|
if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
|
|
if (yychar < 0)
|
|
{
|
|
if ((yychar = YYLEX) < 0) yychar = 0;
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
{
|
|
yys = 0;
|
|
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
|
|
if (!yys) yys = "illegal-symbol";
|
|
printf("%sdebug: state %d, reading %d (%s)\n",
|
|
YYPREFIX, yystate, yychar, yys);
|
|
}
|
|
#endif
|
|
}
|
|
if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: state %d, shifting to state %d\n",
|
|
YYPREFIX, yystate, yytable[yyn]);
|
|
#endif
|
|
if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
|
|
{
|
|
goto yyoverflow;
|
|
}
|
|
yystate = yytable[yyn];
|
|
*++yystack.s_mark = yytable[yyn];
|
|
*++yystack.l_mark = yylval;
|
|
yychar = YYEMPTY;
|
|
if (yyerrflag > 0) --yyerrflag;
|
|
goto yyloop;
|
|
}
|
|
if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
|
|
{
|
|
yyn = yytable[yyn];
|
|
goto yyreduce;
|
|
}
|
|
if (yyerrflag) goto yyinrecovery;
|
|
|
|
yyerror("syntax error");
|
|
|
|
goto yyerrlab;
|
|
|
|
yyerrlab:
|
|
++yynerrs;
|
|
|
|
yyinrecovery:
|
|
if (yyerrflag < 3)
|
|
{
|
|
yyerrflag = 3;
|
|
for (;;)
|
|
{
|
|
if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: state %d, error recovery shifting\
|
|
to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
|
|
#endif
|
|
if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
|
|
{
|
|
goto yyoverflow;
|
|
}
|
|
yystate = yytable[yyn];
|
|
*++yystack.s_mark = yytable[yyn];
|
|
*++yystack.l_mark = yylval;
|
|
goto yyloop;
|
|
}
|
|
else
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: error recovery discarding state %d\n",
|
|
YYPREFIX, *yystack.s_mark);
|
|
#endif
|
|
if (yystack.s_mark <= yystack.s_base) goto yyabort;
|
|
--yystack.s_mark;
|
|
--yystack.l_mark;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (yychar == 0) goto yyabort;
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
{
|
|
yys = 0;
|
|
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
|
|
if (!yys) yys = "illegal-symbol";
|
|
printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
|
|
YYPREFIX, yystate, yychar, yys);
|
|
}
|
|
#endif
|
|
yychar = YYEMPTY;
|
|
goto yyloop;
|
|
}
|
|
|
|
yyreduce:
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: state %d, reducing by rule %d (%s)\n",
|
|
YYPREFIX, yystate, yyn, yyrule[yyn]);
|
|
#endif
|
|
yym = yylen[yyn];
|
|
if (yym)
|
|
yyval = yystack.l_mark[1-yym];
|
|
else
|
|
memset(&yyval, 0, sizeof yyval);
|
|
switch (yyn)
|
|
{
|
|
case 1:
|
|
{
|
|
checkundefined();
|
|
}
|
|
break;
|
|
case 3:
|
|
{ lex_error_message("implicit tagging is not supported"); }
|
|
break;
|
|
case 4:
|
|
{ lex_error_message("automatic tagging is not supported"); }
|
|
break;
|
|
case 6:
|
|
{ lex_error_message("no extensibility options supported"); }
|
|
break;
|
|
case 16:
|
|
{
|
|
struct string_list *sl;
|
|
for(sl = yystack.l_mark[-3].sl; sl != NULL; sl = sl->next) {
|
|
Symbol *s = addsym(sl->string);
|
|
s->stype = Stype;
|
|
gen_template_import(s);
|
|
}
|
|
add_import(yystack.l_mark[-1].name);
|
|
}
|
|
break;
|
|
case 17:
|
|
{
|
|
struct string_list *sl;
|
|
for(sl = yystack.l_mark[-1].sl; sl != NULL; sl = sl->next)
|
|
add_export(sl->string);
|
|
}
|
|
break;
|
|
case 24:
|
|
{
|
|
yyval.sl = emalloc(sizeof(*yyval.sl));
|
|
yyval.sl->string = yystack.l_mark[-2].name;
|
|
yyval.sl->next = yystack.l_mark[0].sl;
|
|
}
|
|
break;
|
|
case 25:
|
|
{
|
|
yyval.sl = emalloc(sizeof(*yyval.sl));
|
|
yyval.sl->string = yystack.l_mark[0].name;
|
|
yyval.sl->next = NULL;
|
|
}
|
|
break;
|
|
case 26:
|
|
{
|
|
Symbol *s = addsym (yystack.l_mark[-2].name);
|
|
s->stype = Stype;
|
|
s->type = yystack.l_mark[0].type;
|
|
fix_labels(s);
|
|
generate_type (s);
|
|
}
|
|
break;
|
|
case 44:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Boolean,
|
|
TE_EXPLICIT, new_type(TBoolean));
|
|
}
|
|
break;
|
|
case 45:
|
|
{
|
|
if(yystack.l_mark[-3].value->type != integervalue)
|
|
lex_error_message("Non-integer used in first part of range");
|
|
if(yystack.l_mark[-3].value->type != integervalue)
|
|
lex_error_message("Non-integer in second part of range");
|
|
yyval.range = ecalloc(1, sizeof(*yyval.range));
|
|
yyval.range->min = yystack.l_mark[-3].value->u.integervalue;
|
|
yyval.range->max = yystack.l_mark[-1].value->u.integervalue;
|
|
}
|
|
break;
|
|
case 46:
|
|
{
|
|
if(yystack.l_mark[-3].value->type != integervalue)
|
|
lex_error_message("Non-integer in first part of range");
|
|
yyval.range = ecalloc(1, sizeof(*yyval.range));
|
|
yyval.range->min = yystack.l_mark[-3].value->u.integervalue;
|
|
yyval.range->max = yystack.l_mark[-3].value->u.integervalue - 1;
|
|
}
|
|
break;
|
|
case 47:
|
|
{
|
|
if(yystack.l_mark[-1].value->type != integervalue)
|
|
lex_error_message("Non-integer in second part of range");
|
|
yyval.range = ecalloc(1, sizeof(*yyval.range));
|
|
yyval.range->min = yystack.l_mark[-1].value->u.integervalue + 2;
|
|
yyval.range->max = yystack.l_mark[-1].value->u.integervalue;
|
|
}
|
|
break;
|
|
case 48:
|
|
{
|
|
if(yystack.l_mark[-1].value->type != integervalue)
|
|
lex_error_message("Non-integer used in limit");
|
|
yyval.range = ecalloc(1, sizeof(*yyval.range));
|
|
yyval.range->min = yystack.l_mark[-1].value->u.integervalue;
|
|
yyval.range->max = yystack.l_mark[-1].value->u.integervalue;
|
|
}
|
|
break;
|
|
case 49:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Integer,
|
|
TE_EXPLICIT, new_type(TInteger));
|
|
}
|
|
break;
|
|
case 50:
|
|
{
|
|
yyval.type = new_type(TInteger);
|
|
yyval.type->range = yystack.l_mark[0].range;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 51:
|
|
{
|
|
yyval.type = new_type(TInteger);
|
|
yyval.type->members = yystack.l_mark[-1].members;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 52:
|
|
{
|
|
yyval.members = emalloc(sizeof(*yyval.members));
|
|
ASN1_TAILQ_INIT(yyval.members);
|
|
ASN1_TAILQ_INSERT_HEAD(yyval.members, yystack.l_mark[0].member, members);
|
|
}
|
|
break;
|
|
case 53:
|
|
{
|
|
ASN1_TAILQ_INSERT_TAIL(yystack.l_mark[-2].members, yystack.l_mark[0].member, members);
|
|
yyval.members = yystack.l_mark[-2].members;
|
|
}
|
|
break;
|
|
case 54:
|
|
{ yyval.members = yystack.l_mark[-2].members; }
|
|
break;
|
|
case 55:
|
|
{
|
|
yyval.member = emalloc(sizeof(*yyval.member));
|
|
yyval.member->name = yystack.l_mark[-3].name;
|
|
yyval.member->gen_name = estrdup(yystack.l_mark[-3].name);
|
|
output_name (yyval.member->gen_name);
|
|
yyval.member->val = yystack.l_mark[-1].constant;
|
|
yyval.member->optional = 0;
|
|
yyval.member->ellipsis = 0;
|
|
yyval.member->type = NULL;
|
|
}
|
|
break;
|
|
case 56:
|
|
{
|
|
yyval.type = new_type(TInteger);
|
|
yyval.type->members = yystack.l_mark[-1].members;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Enumerated, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 58:
|
|
{
|
|
yyval.type = new_type(TBitString);
|
|
yyval.type->members = emalloc(sizeof(*yyval.type->members));
|
|
ASN1_TAILQ_INIT(yyval.type->members);
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_BitString, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 59:
|
|
{
|
|
yyval.type = new_type(TBitString);
|
|
yyval.type->members = yystack.l_mark[-1].members;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_BitString, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 60:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_OID,
|
|
TE_EXPLICIT, new_type(TOID));
|
|
}
|
|
break;
|
|
case 61:
|
|
{
|
|
Type *t = new_type(TOctetString);
|
|
t->range = yystack.l_mark[0].range;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_OctetString,
|
|
TE_EXPLICIT, t);
|
|
}
|
|
break;
|
|
case 62:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Null,
|
|
TE_EXPLICIT, new_type(TNull));
|
|
}
|
|
break;
|
|
case 63:
|
|
{ yyval.range = NULL; }
|
|
break;
|
|
case 64:
|
|
{ yyval.range = yystack.l_mark[0].range; }
|
|
break;
|
|
case 65:
|
|
{
|
|
yyval.type = new_type(TSequence);
|
|
yyval.type->members = yystack.l_mark[-1].members;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 66:
|
|
{
|
|
yyval.type = new_type(TSequence);
|
|
yyval.type->members = NULL;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 67:
|
|
{
|
|
yyval.type = new_type(TSequenceOf);
|
|
yyval.type->range = yystack.l_mark[-2].range;
|
|
yyval.type->subtype = yystack.l_mark[0].type;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 68:
|
|
{
|
|
yyval.type = new_type(TSet);
|
|
yyval.type->members = yystack.l_mark[-1].members;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 69:
|
|
{
|
|
yyval.type = new_type(TSet);
|
|
yyval.type->members = NULL;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 70:
|
|
{
|
|
yyval.type = new_type(TSetOf);
|
|
yyval.type->subtype = yystack.l_mark[0].type;
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, yyval.type);
|
|
}
|
|
break;
|
|
case 71:
|
|
{
|
|
yyval.type = new_type(TChoice);
|
|
yyval.type->members = yystack.l_mark[-1].members;
|
|
}
|
|
break;
|
|
case 74:
|
|
{
|
|
Symbol *s = addsym(yystack.l_mark[0].name);
|
|
yyval.type = new_type(TType);
|
|
if(s->stype != Stype && s->stype != SUndefined)
|
|
lex_error_message ("%s is not a type\n", yystack.l_mark[0].name);
|
|
else
|
|
yyval.type->symbol = s;
|
|
}
|
|
break;
|
|
case 75:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_GeneralizedTime,
|
|
TE_EXPLICIT, new_type(TGeneralizedTime));
|
|
}
|
|
break;
|
|
case 76:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_UTCTime,
|
|
TE_EXPLICIT, new_type(TUTCTime));
|
|
}
|
|
break;
|
|
case 77:
|
|
{
|
|
/* if (Constraint.type == contentConstrant) {
|
|
assert(Constraint.u.constraint.type == octetstring|bitstring-w/o-NamedBitList); // remember to check type reference too
|
|
if (Constraint.u.constraint.type) {
|
|
assert((Constraint.u.constraint.type.length % 8) == 0);
|
|
}
|
|
}
|
|
if (Constraint.u.constraint.encoding) {
|
|
type == der-oid|ber-oid
|
|
}
|
|
*/
|
|
}
|
|
break;
|
|
case 78:
|
|
{
|
|
yyval.constraint_spec = yystack.l_mark[-1].constraint_spec;
|
|
}
|
|
break;
|
|
case 82:
|
|
{
|
|
yyval.constraint_spec = new_constraint_spec(CT_CONTENTS);
|
|
yyval.constraint_spec->u.content.type = yystack.l_mark[0].type;
|
|
yyval.constraint_spec->u.content.encoding = NULL;
|
|
}
|
|
break;
|
|
case 83:
|
|
{
|
|
if (yystack.l_mark[0].value->type != objectidentifiervalue)
|
|
lex_error_message("Non-OID used in ENCODED BY constraint");
|
|
yyval.constraint_spec = new_constraint_spec(CT_CONTENTS);
|
|
yyval.constraint_spec->u.content.type = NULL;
|
|
yyval.constraint_spec->u.content.encoding = yystack.l_mark[0].value;
|
|
}
|
|
break;
|
|
case 84:
|
|
{
|
|
if (yystack.l_mark[0].value->type != objectidentifiervalue)
|
|
lex_error_message("Non-OID used in ENCODED BY constraint");
|
|
yyval.constraint_spec = new_constraint_spec(CT_CONTENTS);
|
|
yyval.constraint_spec->u.content.type = yystack.l_mark[-3].type;
|
|
yyval.constraint_spec->u.content.encoding = yystack.l_mark[0].value;
|
|
}
|
|
break;
|
|
case 85:
|
|
{
|
|
yyval.constraint_spec = new_constraint_spec(CT_USER);
|
|
}
|
|
break;
|
|
case 86:
|
|
{
|
|
yyval.type = new_type(TTag);
|
|
yyval.type->tag = yystack.l_mark[-2].tag;
|
|
yyval.type->tag.tagenv = yystack.l_mark[-1].constant;
|
|
if(yystack.l_mark[0].type->type == TTag && yystack.l_mark[-1].constant == TE_IMPLICIT) {
|
|
yyval.type->subtype = yystack.l_mark[0].type->subtype;
|
|
free(yystack.l_mark[0].type);
|
|
} else
|
|
yyval.type->subtype = yystack.l_mark[0].type;
|
|
}
|
|
break;
|
|
case 87:
|
|
{
|
|
yyval.tag.tagclass = yystack.l_mark[-2].constant;
|
|
yyval.tag.tagvalue = yystack.l_mark[-1].constant;
|
|
yyval.tag.tagenv = TE_EXPLICIT;
|
|
}
|
|
break;
|
|
case 88:
|
|
{
|
|
yyval.constant = ASN1_C_CONTEXT;
|
|
}
|
|
break;
|
|
case 89:
|
|
{
|
|
yyval.constant = ASN1_C_UNIV;
|
|
}
|
|
break;
|
|
case 90:
|
|
{
|
|
yyval.constant = ASN1_C_APPL;
|
|
}
|
|
break;
|
|
case 91:
|
|
{
|
|
yyval.constant = ASN1_C_PRIVATE;
|
|
}
|
|
break;
|
|
case 92:
|
|
{
|
|
yyval.constant = TE_EXPLICIT;
|
|
}
|
|
break;
|
|
case 93:
|
|
{
|
|
yyval.constant = TE_EXPLICIT;
|
|
}
|
|
break;
|
|
case 94:
|
|
{
|
|
yyval.constant = TE_IMPLICIT;
|
|
}
|
|
break;
|
|
case 95:
|
|
{
|
|
Symbol *s;
|
|
s = addsym (yystack.l_mark[-3].name);
|
|
|
|
s->stype = SValue;
|
|
s->value = yystack.l_mark[0].value;
|
|
generate_constant (s);
|
|
}
|
|
break;
|
|
case 97:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_GeneralString,
|
|
TE_EXPLICIT, new_type(TGeneralString));
|
|
}
|
|
break;
|
|
case 98:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_TeletexString,
|
|
TE_EXPLICIT, new_type(TTeletexString));
|
|
}
|
|
break;
|
|
case 99:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_UTF8String,
|
|
TE_EXPLICIT, new_type(TUTF8String));
|
|
}
|
|
break;
|
|
case 100:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_PrintableString,
|
|
TE_EXPLICIT, new_type(TPrintableString));
|
|
}
|
|
break;
|
|
case 101:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_VisibleString,
|
|
TE_EXPLICIT, new_type(TVisibleString));
|
|
}
|
|
break;
|
|
case 102:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_IA5String,
|
|
TE_EXPLICIT, new_type(TIA5String));
|
|
}
|
|
break;
|
|
case 103:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_BMPString,
|
|
TE_EXPLICIT, new_type(TBMPString));
|
|
}
|
|
break;
|
|
case 104:
|
|
{
|
|
yyval.type = new_tag(ASN1_C_UNIV, UT_UniversalString,
|
|
TE_EXPLICIT, new_type(TUniversalString));
|
|
}
|
|
break;
|
|
case 105:
|
|
{
|
|
yyval.members = emalloc(sizeof(*yyval.members));
|
|
ASN1_TAILQ_INIT(yyval.members);
|
|
ASN1_TAILQ_INSERT_HEAD(yyval.members, yystack.l_mark[0].member, members);
|
|
}
|
|
break;
|
|
case 106:
|
|
{
|
|
ASN1_TAILQ_INSERT_TAIL(yystack.l_mark[-2].members, yystack.l_mark[0].member, members);
|
|
yyval.members = yystack.l_mark[-2].members;
|
|
}
|
|
break;
|
|
case 107:
|
|
{
|
|
struct member *m = ecalloc(1, sizeof(*m));
|
|
m->name = estrdup("...");
|
|
m->gen_name = estrdup("asn1_ellipsis");
|
|
m->ellipsis = 1;
|
|
ASN1_TAILQ_INSERT_TAIL(yystack.l_mark[-2].members, m, members);
|
|
yyval.members = yystack.l_mark[-2].members;
|
|
}
|
|
break;
|
|
case 108:
|
|
{
|
|
yyval.member = emalloc(sizeof(*yyval.member));
|
|
yyval.member->name = yystack.l_mark[-1].name;
|
|
yyval.member->gen_name = estrdup(yystack.l_mark[-1].name);
|
|
output_name (yyval.member->gen_name);
|
|
yyval.member->type = yystack.l_mark[0].type;
|
|
yyval.member->ellipsis = 0;
|
|
}
|
|
break;
|
|
case 109:
|
|
{
|
|
yyval.member = yystack.l_mark[0].member;
|
|
yyval.member->optional = 0;
|
|
yyval.member->defval = NULL;
|
|
}
|
|
break;
|
|
case 110:
|
|
{
|
|
yyval.member = yystack.l_mark[-1].member;
|
|
yyval.member->optional = 1;
|
|
yyval.member->defval = NULL;
|
|
}
|
|
break;
|
|
case 111:
|
|
{
|
|
yyval.member = yystack.l_mark[-2].member;
|
|
yyval.member->optional = 0;
|
|
yyval.member->defval = yystack.l_mark[0].value;
|
|
}
|
|
break;
|
|
case 112:
|
|
{
|
|
yyval.members = emalloc(sizeof(*yyval.members));
|
|
ASN1_TAILQ_INIT(yyval.members);
|
|
ASN1_TAILQ_INSERT_HEAD(yyval.members, yystack.l_mark[0].member, members);
|
|
}
|
|
break;
|
|
case 113:
|
|
{
|
|
ASN1_TAILQ_INSERT_TAIL(yystack.l_mark[-2].members, yystack.l_mark[0].member, members);
|
|
yyval.members = yystack.l_mark[-2].members;
|
|
}
|
|
break;
|
|
case 114:
|
|
{
|
|
yyval.member = emalloc(sizeof(*yyval.member));
|
|
yyval.member->name = yystack.l_mark[-3].name;
|
|
yyval.member->gen_name = estrdup(yystack.l_mark[-3].name);
|
|
output_name (yyval.member->gen_name);
|
|
yyval.member->val = yystack.l_mark[-1].constant;
|
|
yyval.member->optional = 0;
|
|
yyval.member->ellipsis = 0;
|
|
yyval.member->type = NULL;
|
|
}
|
|
break;
|
|
case 116:
|
|
{ yyval.objid = NULL; }
|
|
break;
|
|
case 117:
|
|
{
|
|
yyval.objid = yystack.l_mark[-1].objid;
|
|
}
|
|
break;
|
|
case 118:
|
|
{
|
|
yyval.objid = NULL;
|
|
}
|
|
break;
|
|
case 119:
|
|
{
|
|
if (yystack.l_mark[0].objid) {
|
|
yyval.objid = yystack.l_mark[0].objid;
|
|
add_oid_to_tail(yystack.l_mark[0].objid, yystack.l_mark[-1].objid);
|
|
} else {
|
|
yyval.objid = yystack.l_mark[-1].objid;
|
|
}
|
|
}
|
|
break;
|
|
case 120:
|
|
{
|
|
yyval.objid = new_objid(yystack.l_mark[-3].name, yystack.l_mark[-1].constant);
|
|
}
|
|
break;
|
|
case 121:
|
|
{
|
|
Symbol *s = addsym(yystack.l_mark[0].name);
|
|
if(s->stype != SValue ||
|
|
s->value->type != objectidentifiervalue) {
|
|
lex_error_message("%s is not an object identifier\n",
|
|
s->name);
|
|
exit(1);
|
|
}
|
|
yyval.objid = s->value->u.objectidentifiervalue;
|
|
}
|
|
break;
|
|
case 122:
|
|
{
|
|
yyval.objid = new_objid(NULL, yystack.l_mark[0].constant);
|
|
}
|
|
break;
|
|
case 132:
|
|
{
|
|
Symbol *s = addsym(yystack.l_mark[0].name);
|
|
if(s->stype != SValue)
|
|
lex_error_message ("%s is not a value\n",
|
|
s->name);
|
|
else
|
|
yyval.value = s->value;
|
|
}
|
|
break;
|
|
case 133:
|
|
{
|
|
yyval.value = emalloc(sizeof(*yyval.value));
|
|
yyval.value->type = stringvalue;
|
|
yyval.value->u.stringvalue = yystack.l_mark[0].name;
|
|
}
|
|
break;
|
|
case 134:
|
|
{
|
|
yyval.value = emalloc(sizeof(*yyval.value));
|
|
yyval.value->type = booleanvalue;
|
|
yyval.value->u.booleanvalue = 0;
|
|
}
|
|
break;
|
|
case 135:
|
|
{
|
|
yyval.value = emalloc(sizeof(*yyval.value));
|
|
yyval.value->type = booleanvalue;
|
|
yyval.value->u.booleanvalue = 0;
|
|
}
|
|
break;
|
|
case 136:
|
|
{
|
|
yyval.value = emalloc(sizeof(*yyval.value));
|
|
yyval.value->type = integervalue;
|
|
yyval.value->u.integervalue = yystack.l_mark[0].constant;
|
|
}
|
|
break;
|
|
case 138:
|
|
{
|
|
}
|
|
break;
|
|
case 139:
|
|
{
|
|
yyval.value = emalloc(sizeof(*yyval.value));
|
|
yyval.value->type = objectidentifiervalue;
|
|
yyval.value->u.objectidentifiervalue = yystack.l_mark[0].objid;
|
|
}
|
|
break;
|
|
}
|
|
yystack.s_mark -= yym;
|
|
yystate = *yystack.s_mark;
|
|
yystack.l_mark -= yym;
|
|
yym = yylhs[yyn];
|
|
if (yystate == 0 && yym == 0)
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: after reduction, shifting from state 0 to\
|
|
state %d\n", YYPREFIX, YYFINAL);
|
|
#endif
|
|
yystate = YYFINAL;
|
|
*++yystack.s_mark = YYFINAL;
|
|
*++yystack.l_mark = yyval;
|
|
if (yychar < 0)
|
|
{
|
|
if ((yychar = YYLEX) < 0) yychar = 0;
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
{
|
|
yys = 0;
|
|
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
|
|
if (!yys) yys = "illegal-symbol";
|
|
printf("%sdebug: state %d, reading %d (%s)\n",
|
|
YYPREFIX, YYFINAL, yychar, yys);
|
|
}
|
|
#endif
|
|
}
|
|
if (yychar == 0) goto yyaccept;
|
|
goto yyloop;
|
|
}
|
|
if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
|
|
yystate = yytable[yyn];
|
|
else
|
|
yystate = yydgoto[yym];
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: after reduction, shifting from state %d \
|
|
to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
|
|
#endif
|
|
if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
|
|
{
|
|
goto yyoverflow;
|
|
}
|
|
*++yystack.s_mark = (short) yystate;
|
|
*++yystack.l_mark = yyval;
|
|
goto yyloop;
|
|
|
|
yyoverflow:
|
|
yyerror("yacc stack overflow");
|
|
|
|
yyabort:
|
|
yyfreestack(&yystack);
|
|
return (1);
|
|
|
|
yyaccept:
|
|
yyfreestack(&yystack);
|
|
return (0);
|
|
}
|