#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 #line 39 "asn1parse.c" #include #include #include #include #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 #line 71 "asn1parse.c" #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 */ #line 72 "asn1parse.c" /* 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; #line 945 "asn1parse.c" 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); } #line 721 "asn1parse.c" #if YYDEBUG #include /* needed for printf */ #endif #include /* needed for malloc, etc */ #include /* 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: #line 241 "asn1parse.c" { checkundefined(); } break; case 3: #line 248 "asn1parse.c" { lex_error_message("implicit tagging is not supported"); } break; case 4: #line 250 "asn1parse.c" { lex_error_message("automatic tagging is not supported"); } break; case 6: #line 255 "asn1parse.c" { lex_error_message("no extensibility options supported"); } break; case 16: #line 276 "asn1parse.c" { 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: #line 288 "asn1parse.c" { struct string_list *sl; for(sl = yystack.l_mark[-1].sl; sl != NULL; sl = sl->next) add_export(sl->string); } break; case 24: #line 306 "asn1parse.c" { 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: #line 312 "asn1parse.c" { yyval.sl = emalloc(sizeof(*yyval.sl)); yyval.sl->string = yystack.l_mark[0].name; yyval.sl->next = NULL; } break; case 26: #line 320 "asn1parse.c" { 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: #line 351 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_Boolean, TE_EXPLICIT, new_type(TBoolean)); } break; case 45: #line 358 "asn1parse.c" { 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: #line 368 "asn1parse.c" { 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: #line 376 "asn1parse.c" { 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: #line 384 "asn1parse.c" { 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: #line 395 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, new_type(TInteger)); } break; case 50: #line 400 "asn1parse.c" { 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: #line 406 "asn1parse.c" { 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: #line 414 "asn1parse.c" { 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: #line 420 "asn1parse.c" { 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: #line 425 "asn1parse.c" { yyval.members = yystack.l_mark[-2].members; } break; case 55: #line 429 "asn1parse.c" { 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: #line 442 "asn1parse.c" { 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: #line 453 "asn1parse.c" { 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: #line 460 "asn1parse.c" { 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: #line 468 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_OID, TE_EXPLICIT, new_type(TOID)); } break; case 61: #line 474 "asn1parse.c" { 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: #line 483 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_Null, TE_EXPLICIT, new_type(TNull)); } break; case 63: #line 490 "asn1parse.c" { yyval.range = NULL; } break; case 64: #line 492 "asn1parse.c" { yyval.range = yystack.l_mark[0].range; } break; case 65: #line 497 "asn1parse.c" { 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: #line 503 "asn1parse.c" { 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: #line 511 "asn1parse.c" { 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: #line 520 "asn1parse.c" { 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: #line 526 "asn1parse.c" { 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: #line 534 "asn1parse.c" { 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: #line 542 "asn1parse.c" { yyval.type = new_type(TChoice); yyval.type->members = yystack.l_mark[-1].members; } break; case 74: #line 553 "asn1parse.c" { 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: #line 564 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_GeneralizedTime, TE_EXPLICIT, new_type(TGeneralizedTime)); } break; case 76: #line 569 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_UTCTime, TE_EXPLICIT, new_type(TUTCTime)); } break; case 77: #line 576 "asn1parse.c" { /* 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: #line 592 "asn1parse.c" { yyval.constraint_spec = yystack.l_mark[-1].constraint_spec; } break; case 82: #line 605 "asn1parse.c" { 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: #line 611 "asn1parse.c" { 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: #line 619 "asn1parse.c" { 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: #line 629 "asn1parse.c" { yyval.constraint_spec = new_constraint_spec(CT_USER); } break; case 86: #line 635 "asn1parse.c" { 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: #line 648 "asn1parse.c" { yyval.tag.tagclass = yystack.l_mark[-2].constant; yyval.tag.tagvalue = yystack.l_mark[-1].constant; yyval.tag.tagenv = TE_EXPLICIT; } break; case 88: #line 656 "asn1parse.c" { yyval.constant = ASN1_C_CONTEXT; } break; case 89: #line 660 "asn1parse.c" { yyval.constant = ASN1_C_UNIV; } break; case 90: #line 664 "asn1parse.c" { yyval.constant = ASN1_C_APPL; } break; case 91: #line 668 "asn1parse.c" { yyval.constant = ASN1_C_PRIVATE; } break; case 92: #line 674 "asn1parse.c" { yyval.constant = TE_EXPLICIT; } break; case 93: #line 678 "asn1parse.c" { yyval.constant = TE_EXPLICIT; } break; case 94: #line 682 "asn1parse.c" { yyval.constant = TE_IMPLICIT; } break; case 95: #line 689 "asn1parse.c" { 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: #line 703 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_GeneralString, TE_EXPLICIT, new_type(TGeneralString)); } break; case 98: #line 708 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_TeletexString, TE_EXPLICIT, new_type(TTeletexString)); } break; case 99: #line 713 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_UTF8String, TE_EXPLICIT, new_type(TUTF8String)); } break; case 100: #line 718 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_PrintableString, TE_EXPLICIT, new_type(TPrintableString)); } break; case 101: #line 723 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_VisibleString, TE_EXPLICIT, new_type(TVisibleString)); } break; case 102: #line 728 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_IA5String, TE_EXPLICIT, new_type(TIA5String)); } break; case 103: #line 733 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_BMPString, TE_EXPLICIT, new_type(TBMPString)); } break; case 104: #line 738 "asn1parse.c" { yyval.type = new_tag(ASN1_C_UNIV, UT_UniversalString, TE_EXPLICIT, new_type(TUniversalString)); } break; case 105: #line 746 "asn1parse.c" { 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: #line 752 "asn1parse.c" { 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: #line 757 "asn1parse.c" { 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: #line 768 "asn1parse.c" { 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: #line 779 "asn1parse.c" { yyval.member = yystack.l_mark[0].member; yyval.member->optional = 0; yyval.member->defval = NULL; } break; case 110: #line 785 "asn1parse.c" { yyval.member = yystack.l_mark[-1].member; yyval.member->optional = 1; yyval.member->defval = NULL; } break; case 111: #line 791 "asn1parse.c" { yyval.member = yystack.l_mark[-2].member; yyval.member->optional = 0; yyval.member->defval = yystack.l_mark[0].value; } break; case 112: #line 799 "asn1parse.c" { 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: #line 805 "asn1parse.c" { 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: #line 812 "asn1parse.c" { 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: #line 825 "asn1parse.c" { yyval.objid = NULL; } break; case 117: #line 829 "asn1parse.c" { yyval.objid = yystack.l_mark[-1].objid; } break; case 118: #line 835 "asn1parse.c" { yyval.objid = NULL; } break; case 119: #line 839 "asn1parse.c" { 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: #line 850 "asn1parse.c" { yyval.objid = new_objid(yystack.l_mark[-3].name, yystack.l_mark[-1].constant); } break; case 121: #line 854 "asn1parse.c" { 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: #line 865 "asn1parse.c" { yyval.objid = new_objid(NULL, yystack.l_mark[0].constant); } break; case 132: #line 888 "asn1parse.c" { 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: #line 899 "asn1parse.c" { yyval.value = emalloc(sizeof(*yyval.value)); yyval.value->type = stringvalue; yyval.value->u.stringvalue = yystack.l_mark[0].name; } break; case 134: #line 907 "asn1parse.c" { yyval.value = emalloc(sizeof(*yyval.value)); yyval.value->type = booleanvalue; yyval.value->u.booleanvalue = 0; } break; case 135: #line 913 "asn1parse.c" { yyval.value = emalloc(sizeof(*yyval.value)); yyval.value->type = booleanvalue; yyval.value->u.booleanvalue = 0; } break; case 136: #line 921 "asn1parse.c" { yyval.value = emalloc(sizeof(*yyval.value)); yyval.value->type = integervalue; yyval.value->u.integervalue = yystack.l_mark[0].constant; } break; case 138: #line 932 "asn1parse.c" { } break; case 139: #line 937 "asn1parse.c" { yyval.value = emalloc(sizeof(*yyval.value)); yyval.value->type = objectidentifiervalue; yyval.value->u.objectidentifiervalue = yystack.l_mark[0].objid; } break; #line 1614 "asn1parse.c" } 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); }