diff options
author | Andrew Bartlett <abartlet@samba.org> | 2005-08-09 03:04:47 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:31:33 -0500 |
commit | c0e8144c5d1e402b36ebe04b843eba62e7ab9958 (patch) | |
tree | 1b885ceee1a88e8cb2822051690b023c8f8acb78 /source4/heimdal/lib/asn1/parse.c | |
parent | 4b93e377cd9809199487e20fa53d8a2c98ad32ea (diff) | |
download | samba-c0e8144c5d1e402b36ebe04b843eba62e7ab9958.tar.gz samba-c0e8144c5d1e402b36ebe04b843eba62e7ab9958.tar.bz2 samba-c0e8144c5d1e402b36ebe04b843eba62e7ab9958.zip |
r9221: Try to merge Heimdal across from lorikeet-heimdal to samba4.
This is my first attempt at this, so there may be a few rough edges.
Andrew Bartlett
(This used to be commit 9a1d2f2fec67930975da856a2d365345cec46216)
Diffstat (limited to 'source4/heimdal/lib/asn1/parse.c')
-rw-r--r-- | source4/heimdal/lib/asn1/parse.c | 1444 |
1 files changed, 1055 insertions, 389 deletions
diff --git a/source4/heimdal/lib/asn1/parse.c b/source4/heimdal/lib/asn1/parse.c index 2f80f32583..2d8697843b 100644 --- a/source4/heimdal/lib/asn1/parse.c +++ b/source4/heimdal/lib/asn1/parse.c @@ -1,7 +1,7 @@ -/* A Bison parser, made by GNU Bison 1.875d. */ +/* A Bison parser, made by GNU Bison 1.875c. */ /* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -53,66 +53,182 @@ /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { - INTEGER = 258, - SEQUENCE = 259, - CHOICE = 260, - OF = 261, - OCTET = 262, - STRING = 263, - GeneralizedTime = 264, - GeneralString = 265, - BIT = 266, - APPLICATION = 267, - OPTIONAL = 268, - EEQUAL = 269, - TBEGIN = 270, - END = 271, - DEFINITIONS = 272, - ENUMERATED = 273, - UTF8String = 274, - NULLTYPE = 275, - EXTERNAL = 276, - DEFAULT = 277, - DOTDOT = 278, - DOTDOTDOT = 279, - BOOLEAN = 280, - IMPORTS = 281, - FROM = 282, - OBJECT = 283, - IDENTIFIER = 284, - IDENT = 285, - CONSTANT = 286 + kw_ABSENT = 258, + kw_ABSTRACT_SYNTAX = 259, + kw_ALL = 260, + kw_APPLICATION = 261, + kw_AUTOMATIC = 262, + kw_BEGIN = 263, + kw_BIT = 264, + kw_BMPString = 265, + kw_BOOLEAN = 266, + kw_BY = 267, + kw_CHARACTER = 268, + kw_CHOICE = 269, + kw_CLASS = 270, + kw_COMPONENT = 271, + kw_COMPONENTS = 272, + kw_CONSTRAINED = 273, + kw_CONTAINING = 274, + kw_DEFAULT = 275, + kw_DEFINITIONS = 276, + kw_EMBEDDED = 277, + kw_ENCODED = 278, + kw_END = 279, + kw_ENUMERATED = 280, + kw_EXCEPT = 281, + kw_EXPLICIT = 282, + kw_EXPORTS = 283, + kw_EXTENSIBILITY = 284, + kw_EXTERNAL = 285, + kw_FALSE = 286, + kw_FROM = 287, + kw_GeneralString = 288, + kw_GeneralizedTime = 289, + kw_GraphicString = 290, + kw_IA5String = 291, + kw_IDENTIFIER = 292, + kw_IMPLICIT = 293, + kw_IMPLIED = 294, + kw_IMPORTS = 295, + kw_INCLUDES = 296, + kw_INSTANCE = 297, + kw_INTEGER = 298, + kw_INTERSECTION = 299, + kw_ISO646String = 300, + kw_MAX = 301, + kw_MIN = 302, + kw_MINUS_INFINITY = 303, + kw_NULL = 304, + kw_NumericString = 305, + kw_OBJECT = 306, + kw_OCTET = 307, + kw_OF = 308, + kw_OPTIONAL = 309, + kw_ObjectDescriptor = 310, + kw_PATTERN = 311, + kw_PDV = 312, + kw_PLUS_INFINITY = 313, + kw_PRESENT = 314, + kw_PRIVATE = 315, + kw_PrintableString = 316, + kw_REAL = 317, + kw_RELATIVE_OID = 318, + kw_SEQUENCE = 319, + kw_SET = 320, + kw_SIZE = 321, + kw_STRING = 322, + kw_SYNTAX = 323, + kw_T61String = 324, + kw_TAGS = 325, + kw_TRUE = 326, + kw_TYPE_IDENTIFIER = 327, + kw_TeletexString = 328, + kw_UNION = 329, + kw_UNIQUE = 330, + kw_UNIVERSAL = 331, + kw_UTCTime = 332, + kw_UTF8String = 333, + kw_UniversalString = 334, + kw_VideotexString = 335, + kw_VisibleString = 336, + kw_WITH = 337, + RANGE = 338, + EEQUAL = 339, + ELLIPSIS = 340, + IDENTIFIER = 341, + referencename = 342, + STRING = 343, + NUMBER = 344 }; #endif -#define INTEGER 258 -#define SEQUENCE 259 -#define CHOICE 260 -#define OF 261 -#define OCTET 262 -#define STRING 263 -#define GeneralizedTime 264 -#define GeneralString 265 -#define BIT 266 -#define APPLICATION 267 -#define OPTIONAL 268 -#define EEQUAL 269 -#define TBEGIN 270 -#define END 271 -#define DEFINITIONS 272 -#define ENUMERATED 273 -#define UTF8String 274 -#define NULLTYPE 275 -#define EXTERNAL 276 -#define DEFAULT 277 -#define DOTDOT 278 -#define DOTDOTDOT 279 -#define BOOLEAN 280 -#define IMPORTS 281 -#define FROM 282 -#define OBJECT 283 -#define IDENTIFIER 284 -#define IDENT 285 -#define CONSTANT 286 +#define kw_ABSENT 258 +#define kw_ABSTRACT_SYNTAX 259 +#define kw_ALL 260 +#define kw_APPLICATION 261 +#define kw_AUTOMATIC 262 +#define kw_BEGIN 263 +#define kw_BIT 264 +#define kw_BMPString 265 +#define kw_BOOLEAN 266 +#define kw_BY 267 +#define kw_CHARACTER 268 +#define kw_CHOICE 269 +#define kw_CLASS 270 +#define kw_COMPONENT 271 +#define kw_COMPONENTS 272 +#define kw_CONSTRAINED 273 +#define kw_CONTAINING 274 +#define kw_DEFAULT 275 +#define kw_DEFINITIONS 276 +#define kw_EMBEDDED 277 +#define kw_ENCODED 278 +#define kw_END 279 +#define kw_ENUMERATED 280 +#define kw_EXCEPT 281 +#define kw_EXPLICIT 282 +#define kw_EXPORTS 283 +#define kw_EXTENSIBILITY 284 +#define kw_EXTERNAL 285 +#define kw_FALSE 286 +#define kw_FROM 287 +#define kw_GeneralString 288 +#define kw_GeneralizedTime 289 +#define kw_GraphicString 290 +#define kw_IA5String 291 +#define kw_IDENTIFIER 292 +#define kw_IMPLICIT 293 +#define kw_IMPLIED 294 +#define kw_IMPORTS 295 +#define kw_INCLUDES 296 +#define kw_INSTANCE 297 +#define kw_INTEGER 298 +#define kw_INTERSECTION 299 +#define kw_ISO646String 300 +#define kw_MAX 301 +#define kw_MIN 302 +#define kw_MINUS_INFINITY 303 +#define kw_NULL 304 +#define kw_NumericString 305 +#define kw_OBJECT 306 +#define kw_OCTET 307 +#define kw_OF 308 +#define kw_OPTIONAL 309 +#define kw_ObjectDescriptor 310 +#define kw_PATTERN 311 +#define kw_PDV 312 +#define kw_PLUS_INFINITY 313 +#define kw_PRESENT 314 +#define kw_PRIVATE 315 +#define kw_PrintableString 316 +#define kw_REAL 317 +#define kw_RELATIVE_OID 318 +#define kw_SEQUENCE 319 +#define kw_SET 320 +#define kw_SIZE 321 +#define kw_STRING 322 +#define kw_SYNTAX 323 +#define kw_T61String 324 +#define kw_TAGS 325 +#define kw_TRUE 326 +#define kw_TYPE_IDENTIFIER 327 +#define kw_TeletexString 328 +#define kw_UNION 329 +#define kw_UNIQUE 330 +#define kw_UNIVERSAL 331 +#define kw_UTCTime 332 +#define kw_UTF8String 333 +#define kw_UniversalString 334 +#define kw_VideotexString 335 +#define kw_VisibleString 336 +#define kw_WITH 337 +#define RANGE 338 +#define EEQUAL 339 +#define ELLIPSIS 340 +#define IDENTIFIER 341 +#define referencename 342 +#define STRING 343 +#define NUMBER 344 @@ -129,19 +245,27 @@ #include "symbol.h" #include "lex.h" #include "gen_locl.h" +#include "der.h" -RCSID("$Id: parse.y,v 1.23 2004/10/13 17:41:48 lha Exp $"); +RCSID("$Id: parse.y,v 1.24 2005/07/12 06:27:35 lha Exp $"); static Type *new_type (Typetype t); +static Type *new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype); void yyerror (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); -static void append (Member *l, Member *r); +struct string_list { + char *string; + struct string_list *next; +}; /* Enabling traces. */ #ifndef YYDEBUG -# define YYDEBUG 0 +# define YYDEBUG 1 #endif /* Enabling verbose error messages. */ @@ -153,16 +277,22 @@ static void append (Member *l, Member *r); #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 56 "parse.y" +#line 64 "parse.y" typedef union YYSTYPE { - int constant; - char *name; - Type *type; - Member *member; - char *defval; + 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; } YYSTYPE; /* Line 191 of yacc.c. */ -#line 166 "$base.c" +#line 296 "parse.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -174,7 +304,7 @@ typedef union YYSTYPE { /* Line 214 of yacc.c. */ -#line 178 "$base.c" +#line 308 "parse.c" #if ! defined (yyoverflow) || YYERROR_VERBOSE @@ -222,7 +352,7 @@ typedef union YYSTYPE { /* A type that is properly aligned for any stack member. */ union yyalloc { - short int yyss; + short yyss; YYSTYPE yyvs; }; @@ -232,7 +362,7 @@ union yyalloc /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ - ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do @@ -274,26 +404,26 @@ union yyalloc #if defined (__STDC__) || defined (__cplusplus) typedef signed char yysigned_char; #else - typedef short int yysigned_char; + typedef short yysigned_char; #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 4 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 107 +#define YYLAST 152 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 42 +#define YYNTOKENS 98 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 17 +#define YYNNTS 61 /* YYNRULES -- Number of rules. */ -#define YYNRULES 48 +#define YYNRULES 120 /* YYNRULES -- Number of states. */ -#define YYNSTATES 100 +#define YYNSTATES 181 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 286 +#define YYMAXUTOK 344 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -304,16 +434,16 @@ static const unsigned char yytranslate[] = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 40, 2, 2, 2, 2, 2, - 34, 35, 2, 2, 32, 41, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 33, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 92, 93, 2, 2, 91, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 38, 2, 39, 2, 2, 2, 2, 2, 2, + 2, 96, 2, 97, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 36, 2, 37, 2, 2, 2, 2, + 2, 2, 2, 94, 2, 95, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -329,51 +459,89 @@ static const unsigned char yytranslate[] = 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31 + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ -static const unsigned char yyprhs[] = +static const unsigned short yyprhs[] = { - 0, 0, 3, 10, 11, 14, 16, 18, 20, 24, - 26, 32, 36, 41, 43, 50, 55, 58, 63, 66, - 68, 70, 72, 74, 78, 83, 88, 94, 96, 102, - 104, 105, 107, 111, 115, 121, 124, 127, 129, 131, - 134, 139, 140, 142, 146, 150, 155, 157, 160 + 0, 0, 3, 12, 15, 18, 21, 22, 25, 26, + 29, 30, 34, 35, 37, 38, 40, 43, 48, 50, + 53, 55, 57, 61, 63, 67, 69, 71, 73, 75, + 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, + 97, 99, 101, 107, 109, 112, 117, 119, 123, 127, + 132, 137, 139, 142, 148, 151, 154, 156, 161, 165, + 169, 174, 178, 182, 187, 189, 191, 193, 195, 197, + 201, 206, 207, 209, 211, 213, 214, 216, 218, 223, + 225, 227, 229, 231, 233, 235, 237, 239, 243, 247, + 250, 252, 255, 259, 261, 265, 270, 272, 273, 277, + 278, 281, 286, 288, 290, 292, 294, 296, 298, 300, + 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, + 322 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yysigned_char yyrhs[] = +static const short yyrhs[] = { - 43, 0, -1, 30, 17, 14, 15, 44, 16, -1, - -1, 44, 45, -1, 47, -1, 48, -1, 49, -1, - 30, 32, 46, -1, 30, -1, 26, 46, 27, 30, - 33, -1, 30, 14, 50, -1, 30, 50, 14, 58, - -1, 3, -1, 3, 34, 58, 23, 58, 35, -1, - 3, 36, 56, 37, -1, 28, 29, -1, 18, 36, - 56, 37, -1, 7, 8, -1, 10, -1, 19, -1, - 20, -1, 9, -1, 4, 6, 50, -1, 4, 36, - 51, 37, -1, 5, 36, 51, 37, -1, 11, 8, - 36, 56, 37, -1, 30, -1, 38, 12, 58, 39, - 50, -1, 25, -1, -1, 53, -1, 51, 32, 24, - -1, 51, 32, 53, -1, 30, 38, 58, 39, 50, - -1, 52, 54, -1, 52, 55, -1, 52, -1, 13, - -1, 22, 58, -1, 22, 40, 30, 40, -1, -1, - 57, -1, 56, 32, 24, -1, 56, 32, 57, -1, - 30, 34, 58, 35, -1, 31, -1, 41, 31, -1, - 30, -1 + 99, 0, -1, 86, 21, 100, 101, 84, 8, 102, + 24, -1, 27, 70, -1, 38, 70, -1, 7, 70, + -1, -1, 29, 39, -1, -1, 103, 107, -1, -1, + 40, 104, 90, -1, -1, 105, -1, -1, 106, -1, + 105, 106, -1, 109, 32, 86, 144, -1, 108, -1, + 108, 107, -1, 110, -1, 136, -1, 86, 91, 109, + -1, 86, -1, 86, 84, 111, -1, 112, -1, 129, + -1, 120, -1, 113, -1, 137, -1, 128, -1, 118, + -1, 115, -1, 123, -1, 121, -1, 122, -1, 124, + -1, 125, -1, 126, -1, 127, -1, 132, -1, 11, + -1, 92, 148, 83, 148, 93, -1, 43, -1, 43, + 114, -1, 43, 94, 116, 95, -1, 117, -1, 116, + 91, 117, -1, 116, 91, 85, -1, 86, 92, 156, + 93, -1, 25, 94, 119, 95, -1, 116, -1, 9, + 67, -1, 9, 67, 94, 142, 95, -1, 51, 37, + -1, 52, 67, -1, 49, -1, 64, 94, 139, 95, + -1, 64, 94, 95, -1, 64, 53, 111, -1, 65, + 94, 139, 95, -1, 65, 94, 95, -1, 65, 53, + 111, -1, 14, 94, 139, 95, -1, 130, -1, 131, + -1, 86, -1, 34, -1, 77, -1, 133, 135, 111, + -1, 96, 134, 89, 97, -1, -1, 76, -1, 6, + -1, 60, -1, -1, 27, -1, 38, -1, 86, 111, + 84, 148, -1, 138, -1, 33, -1, 78, -1, 61, + -1, 36, -1, 10, -1, 79, -1, 141, -1, 139, + 91, 141, -1, 139, 91, 85, -1, 86, 111, -1, + 140, -1, 140, 54, -1, 140, 20, 148, -1, 143, + -1, 142, 91, 143, -1, 86, 92, 89, 93, -1, + 145, -1, -1, 94, 146, 95, -1, -1, 147, 146, + -1, 86, 92, 89, 93, -1, 86, -1, 89, -1, + 149, -1, 150, -1, 154, -1, 153, -1, 155, -1, + 158, -1, 157, -1, 151, -1, 152, -1, 86, -1, + 88, -1, 71, -1, 31, -1, 156, -1, 89, -1, + 49, -1, 145, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const unsigned char yyrline[] = +static const unsigned short yyrline[] = { - 0, 85, 85, 88, 89, 92, 93, 94, 97, 102, - 109, 113, 122, 131, 132, 140, 145, 146, 151, 152, - 153, 154, 155, 156, 161, 166, 171, 176, 185, 191, - 194, 195, 196, 197, 200, 215, 217, 219, 224, 227, - 229, 233, 234, 235, 236, 239, 252, 253, 254 + 0, 222, 222, 229, 230, 232, 234, 237, 239, 242, + 243, 246, 247, 250, 251, 254, 255, 258, 269, 270, + 273, 274, 277, 283, 291, 301, 302, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 321, 328, 338, 343, 350, 358, 364, 369, 373, + 386, 394, 397, 404, 412, 418, 425, 432, 438, 446, + 454, 460, 468, 476, 483, 484, 487, 498, 503, 510, + 523, 532, 535, 539, 543, 550, 553, 557, 564, 575, + 578, 583, 588, 593, 598, 603, 611, 617, 622, 633, + 644, 650, 656, 664, 670, 677, 690, 691, 694, 701, + 704, 715, 719, 730, 736, 737, 740, 741, 742, 743, + 744, 747, 750, 753, 764, 772, 778, 786, 794, 797, + 802 }; #endif @@ -382,50 +550,97 @@ static const unsigned char yyrline[] = First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { - "$end", "error", "$undefined", "INTEGER", "SEQUENCE", "CHOICE", "OF", - "OCTET", "STRING", "GeneralizedTime", "GeneralString", "BIT", - "APPLICATION", "OPTIONAL", "EEQUAL", "TBEGIN", "END", "DEFINITIONS", - "ENUMERATED", "UTF8String", "NULLTYPE", "EXTERNAL", "DEFAULT", "DOTDOT", - "DOTDOTDOT", "BOOLEAN", "IMPORTS", "FROM", "OBJECT", "IDENTIFIER", - "IDENT", "CONSTANT", "','", "';'", "'('", "')'", "'{'", "'}'", "'['", - "']'", "'\"'", "'-'", "$accept", "envelope", "specification", - "declaration", "referencenames", "imports_decl", "type_decl", - "constant_decl", "type", "memberdecls", "memberdeclstart", "memberdecl", - "optional2", "defvalue", "bitdecls", "bitdecl", "constant", 0 + "$end", "error", "$undefined", "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", "';'", "','", "'('", "')'", "'{'", "'}'", "'['", "']'", + "$accept", "ModuleDefinition", "TagDefault", "ExtensionDefault", + "ModuleBody", "Imports", "SymbolsImported", "SymbolsFromModuleList", + "SymbolsFromModule", "AssignmentList", "Assignment", "referencenames", + "TypeAssignment", "Type", "BuiltinType", "BooleanType", "range", + "IntegerType", "NamedNumberList", "NamedNumber", "EnumeratedType", + "Enumerations", "BitStringType", "ObjectIdentifierType", + "OctetStringType", "NullType", "SequenceType", "SequenceOfType", + "SetType", "SetOfType", "ChoiceType", "ReferencedType", "DefinedType", + "UsefulType", "TaggedType", "Tag", "Class", "tagenv", "ValueAssignment", + "CharacterStringType", "RestrictedCharactedStringType", + "ComponentTypeList", "NamedType", "ComponentType", "NamedBitList", + "NamedBit", "objid_opt", "objid", "objid_list", "objid_element", "Value", + "BuiltinValue", "ReferencedValue", "DefinedValue", "Valuereference", + "CharacterStringValue", "BooleanValue", "IntegerValue", "SignedNumber", + "NullValue", "ObjectIdentifierValue", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ -static const unsigned short int yytoknum[] = +static const unsigned short yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 44, 59, 40, 41, 123, 125, 91, 93, - 34, 45 + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 59, 44, 40, 41, 123, 125, 91, 93 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 0, 42, 43, 44, 44, 45, 45, 45, 46, 46, - 47, 48, 49, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 51, 51, 51, 51, 52, 53, 53, 53, 54, 55, - 55, 56, 56, 56, 56, 57, 58, 58, 58 + 0, 98, 99, 100, 100, 100, 100, 101, 101, 102, + 102, 103, 103, 104, 104, 105, 105, 106, 107, 107, + 108, 108, 109, 109, 110, 111, 111, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 113, 114, 115, 115, 115, 116, 116, 116, 117, + 118, 119, 120, 120, 121, 122, 123, 124, 124, 125, + 126, 126, 127, 128, 129, 129, 130, 131, 131, 132, + 133, 134, 134, 134, 134, 135, 135, 135, 136, 137, + 138, 138, 138, 138, 138, 138, 139, 139, 139, 140, + 141, 141, 141, 142, 142, 143, 144, 144, 145, 146, + 146, 147, 147, 147, 148, 148, 149, 149, 149, 149, + 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, + 158 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const unsigned char yyr2[] = { - 0, 2, 6, 0, 2, 1, 1, 1, 3, 1, - 5, 3, 4, 1, 6, 4, 2, 4, 2, 1, - 1, 1, 1, 3, 4, 4, 5, 1, 5, 1, - 0, 1, 3, 3, 5, 2, 2, 1, 1, 2, - 4, 0, 1, 3, 3, 4, 1, 2, 1 + 0, 2, 8, 2, 2, 2, 0, 2, 0, 2, + 0, 3, 0, 1, 0, 1, 2, 4, 1, 2, + 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 5, 1, 2, 4, 1, 3, 3, 4, + 4, 1, 2, 5, 2, 2, 1, 4, 3, 3, + 4, 3, 3, 4, 1, 1, 1, 1, 1, 3, + 4, 0, 1, 1, 1, 0, 1, 1, 4, 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 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -433,98 +648,145 @@ static const unsigned char yyr2[] = means the default is an error. */ static const unsigned char yydefact[] = { - 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, - 0, 4, 5, 6, 7, 9, 0, 13, 0, 0, - 0, 22, 19, 0, 0, 0, 20, 21, 29, 0, - 27, 0, 0, 0, 0, 0, 41, 0, 30, 30, - 18, 0, 11, 41, 16, 0, 0, 8, 0, 48, - 46, 0, 0, 0, 0, 42, 23, 0, 0, 37, - 31, 0, 41, 0, 0, 12, 10, 47, 0, 0, - 0, 15, 0, 0, 24, 38, 0, 35, 36, 25, - 0, 17, 0, 0, 0, 43, 44, 0, 32, 33, - 0, 39, 26, 28, 14, 45, 0, 0, 34, 40 + 0, 0, 0, 6, 1, 0, 0, 0, 8, 5, + 3, 4, 0, 0, 7, 0, 10, 14, 0, 0, + 23, 0, 13, 15, 0, 2, 0, 9, 18, 20, + 21, 0, 11, 16, 0, 0, 84, 41, 0, 0, + 80, 67, 83, 43, 56, 0, 0, 82, 0, 0, + 68, 81, 85, 0, 66, 71, 0, 25, 28, 32, + 31, 27, 34, 35, 33, 36, 37, 38, 39, 30, + 26, 64, 65, 40, 75, 29, 79, 19, 22, 97, + 52, 0, 0, 0, 0, 44, 54, 55, 0, 0, + 0, 0, 24, 73, 74, 72, 0, 0, 76, 77, + 0, 99, 17, 96, 0, 0, 0, 90, 86, 0, + 51, 46, 0, 116, 119, 115, 113, 114, 118, 120, + 0, 104, 105, 111, 112, 107, 106, 108, 117, 110, + 109, 0, 59, 58, 0, 62, 61, 0, 0, 78, + 69, 102, 103, 0, 99, 0, 0, 93, 89, 0, + 63, 0, 91, 0, 0, 50, 0, 45, 57, 60, + 70, 0, 98, 100, 0, 0, 53, 88, 87, 92, + 0, 48, 47, 0, 0, 0, 94, 49, 42, 101, + 95 }; /* YYDEFGOTO[NTERM-NUM]. */ -static const yysigned_char yydefgoto[] = +static const short yydefgoto[] = { - -1, 2, 7, 11, 16, 12, 13, 14, 32, 58, - 59, 60, 77, 78, 54, 55, 52 + -1, 2, 8, 13, 18, 19, 21, 22, 23, 27, + 28, 24, 29, 56, 57, 58, 85, 59, 110, 111, + 60, 112, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 96, 100, 30, 75, + 76, 106, 107, 108, 146, 147, 102, 119, 143, 144, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -38 +#define YYPACT_NINF -94 static const yysigned_char yypact[] = { - -26, 12, 22, 16, -38, 32, -38, 5, -38, 20, - -2, -38, -38, -38, -38, 27, 41, 42, 13, 45, - 69, -38, -38, 71, 35, 46, -38, -38, -38, 54, - -38, 72, 73, 20, 55, 26, 56, 35, 58, 58, - -38, 53, -38, 56, -38, 26, 26, -38, 57, -38, - -38, 60, 70, 61, -5, -38, -38, 59, 11, 2, - -38, 34, 56, 37, 62, -38, -38, -38, 26, 26, - -10, -38, 26, 40, -38, -38, 21, -38, -38, -38, - 43, -38, 35, 63, 64, -38, -38, 65, -38, -38, - 66, -38, -38, -38, -38, -38, 35, 52, -38, -38 + -49, 5, 60, 3, -94, -6, 1, 10, 43, -94, + -94, -94, 42, -2, -94, 76, -33, 0, 64, 4, + 7, 9, 0, -94, 61, -94, -9, -94, 4, -94, + -94, 0, -94, -94, 14, 28, -94, -94, 12, 13, + -94, -94, -94, -56, -94, 66, 41, -94, -50, -47, + -94, -94, -94, 40, -94, 2, 25, -94, -94, -94, + -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, + -94, -94, -94, -94, -18, -94, -94, -94, -94, 16, + 17, 26, 27, 8, 27, -94, -94, -94, 40, -73, + 40, -72, -94, -94, -94, -94, 34, 8, -94, -94, + 40, -41, -94, -94, 29, 40, -80, -8, -94, 22, + 30, -94, 21, -94, -94, -94, -94, -94, -94, -94, + 44, -94, -94, -94, -94, -94, -94, -94, -94, -94, + -94, -74, -94, -94, -63, -94, -94, -62, 31, -94, + -94, 33, -94, 35, -41, 37, -60, -94, -94, -67, + -94, 8, -94, 45, -19, -94, 8, -94, -94, -94, + -94, 46, -94, -94, 49, 29, -94, -94, -94, -94, + 38, -94, -94, 47, 48, 50, -94, -94, -94, -94, + -94 }; /* YYPGOTO[NTERM-NUM]. */ static const yysigned_char yypgoto[] = { - -38, -38, -38, -38, 67, -38, -38, -38, -24, 68, - -38, 29, -38, -38, -37, 24, -35 + -94, -94, -94, -94, -94, -94, -94, -94, 102, 105, + -94, 108, -94, 32, -94, -94, -94, -94, 58, -10, + -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, + -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, + -94, -30, -94, -4, -94, -17, -94, 67, 6, -94, + -93, -94, -94, -94, -94, -94, -94, -94, -1, -94, + -94 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -1 -static const unsigned char yytable[] = +#define YYTABLE_NINF -13 +static const short yytable[] = { - 42, 17, 18, 19, 1, 20, 63, 21, 22, 23, - 64, 65, 24, 56, 85, 75, 25, 26, 27, 37, - 53, 8, 4, 28, 76, 80, 29, 70, 30, 3, - 5, 9, 71, 83, 84, 10, 31, 87, 17, 18, - 19, 91, 20, 73, 21, 22, 23, 6, 74, 38, - 15, 49, 50, 25, 26, 27, 49, 50, 93, 33, - 28, 90, 51, 29, 88, 30, 73, 51, 34, 70, - 57, 79, 98, 31, 81, 70, 35, 40, 36, 41, - 92, 39, 43, 44, 45, 48, 53, 46, 57, 62, - 66, 67, 99, 68, 86, 69, 97, 72, 94, 95, - 47, 82, 89, 0, 96, 0, 0, 61 + 35, 36, 37, 88, 139, 38, 90, 17, 93, 98, + 5, 149, 151, 105, 105, 150, 39, 154, 167, 105, + 99, 157, 133, 136, 40, 41, 3, 42, 149, 149, + 6, 165, 158, 159, 43, 166, 83, 1, 84, 113, + 44, 7, 45, 46, 89, 141, 152, 91, 142, 35, + 36, 37, 47, -12, 38, 48, 49, 114, 169, 134, + 4, 137, 94, 173, 9, 39, 171, 109, 50, 51, + 52, 10, 12, 40, 41, 53, 42, 54, 95, 115, + 11, 14, 15, 43, 16, 92, 20, 55, 25, 44, + 26, 45, 46, 34, 116, 80, 117, 118, 31, 32, + 79, 47, 101, 86, 48, 49, 81, 82, 87, 97, + 101, 104, 105, 109, 153, 145, 155, 50, 51, 52, + 132, 154, 135, 138, 33, 161, 54, 156, 160, 164, + 162, 177, 140, 77, 118, 174, 55, 148, 175, 78, + 178, 179, 131, 180, 172, 168, 103, 0, 176, 0, + 163, 0, 170 }; -static const yysigned_char yycheck[] = +static const short yycheck[] = { - 24, 3, 4, 5, 30, 7, 43, 9, 10, 11, - 45, 46, 14, 37, 24, 13, 18, 19, 20, 6, - 30, 16, 0, 25, 22, 62, 28, 32, 30, 17, - 14, 26, 37, 68, 69, 30, 38, 72, 3, 4, - 5, 76, 7, 32, 9, 10, 11, 15, 37, 36, - 30, 30, 31, 18, 19, 20, 30, 31, 82, 32, - 25, 40, 41, 28, 24, 30, 32, 41, 27, 32, - 30, 37, 96, 38, 37, 32, 34, 8, 36, 8, - 37, 36, 36, 29, 12, 30, 30, 14, 30, 36, - 33, 31, 40, 23, 70, 34, 30, 38, 35, 35, - 33, 39, 73, -1, 39, -1, -1, 39 + 9, 10, 11, 53, 97, 14, 53, 40, 6, 27, + 7, 91, 20, 86, 86, 95, 25, 91, 85, 86, + 38, 95, 95, 95, 33, 34, 21, 36, 91, 91, + 27, 91, 95, 95, 43, 95, 92, 86, 94, 31, + 49, 38, 51, 52, 94, 86, 54, 94, 89, 9, + 10, 11, 61, 86, 14, 64, 65, 49, 151, 89, + 0, 91, 60, 156, 70, 25, 85, 86, 77, 78, + 79, 70, 29, 33, 34, 84, 36, 86, 76, 71, + 70, 39, 84, 43, 8, 53, 86, 96, 24, 49, + 86, 51, 52, 32, 86, 67, 88, 89, 91, 90, + 86, 61, 94, 37, 64, 65, 94, 94, 67, 84, + 94, 94, 86, 86, 92, 86, 95, 77, 78, 79, + 88, 91, 90, 89, 22, 92, 86, 83, 97, 92, + 95, 93, 100, 28, 89, 89, 96, 105, 89, 31, + 93, 93, 84, 93, 154, 149, 79, -1, 165, -1, + 144, -1, 153 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 30, 43, 17, 0, 14, 15, 44, 16, 26, - 30, 45, 47, 48, 49, 30, 46, 3, 4, 5, - 7, 9, 10, 11, 14, 18, 19, 20, 25, 28, - 30, 38, 50, 32, 27, 34, 36, 6, 36, 36, - 8, 8, 50, 36, 29, 12, 14, 46, 30, 30, - 31, 41, 58, 30, 56, 57, 50, 30, 51, 52, - 53, 51, 36, 56, 58, 58, 33, 31, 23, 34, - 32, 37, 38, 32, 37, 13, 22, 54, 55, 37, - 56, 37, 39, 58, 58, 24, 57, 58, 24, 53, - 40, 58, 37, 50, 35, 35, 39, 30, 50, 40 + 0, 86, 99, 21, 0, 7, 27, 38, 100, 70, + 70, 70, 29, 101, 39, 84, 8, 40, 102, 103, + 86, 104, 105, 106, 109, 24, 86, 107, 108, 110, + 136, 91, 90, 106, 32, 9, 10, 11, 14, 25, + 33, 34, 36, 43, 49, 51, 52, 61, 64, 65, + 77, 78, 79, 84, 86, 96, 111, 112, 113, 115, + 118, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 137, 138, 107, 109, 86, + 67, 94, 94, 92, 94, 114, 37, 67, 53, 94, + 53, 94, 111, 6, 60, 76, 134, 84, 27, 38, + 135, 94, 144, 145, 94, 86, 139, 140, 141, 86, + 116, 117, 119, 31, 49, 71, 86, 88, 89, 145, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 116, 111, 95, 139, 111, 95, 139, 89, 148, + 111, 86, 89, 146, 147, 86, 142, 143, 111, 91, + 95, 20, 54, 92, 91, 95, 83, 95, 95, 95, + 97, 92, 95, 146, 92, 91, 95, 85, 141, 148, + 156, 85, 117, 148, 89, 89, 143, 93, 93, 93, + 93 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) @@ -638,12 +900,12 @@ do { \ #if defined (__STDC__) || defined (__cplusplus) static void -yy_stack_print (short int *bottom, short int *top) +yy_stack_print (short *bottom, short *top) #else static void yy_stack_print (bottom, top) - short int *bottom; - short int *top; + short *bottom; + short *top; #endif { YYFPRINTF (stderr, "Stack now"); @@ -910,9 +1172,9 @@ yyparse () to reallocate them elsewhere. */ /* The state stack. */ - short int yyssa[YYINITDEPTH]; - short int *yyss = yyssa; - register short int *yyssp; + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; @@ -949,7 +1211,6 @@ yyparse () yyssp = yyss; yyvsp = yyvs; - goto yysetstate; /*------------------------------------------------------------. @@ -975,7 +1236,7 @@ yyparse () these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; - short int *yyss1 = yyss; + short *yyss1 = yyss; /* Each stack pointer address is followed by the size of the @@ -1003,7 +1264,7 @@ yyparse () yystacksize = YYMAXDEPTH; { - short int *yyss1 = yyss; + short *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) @@ -1136,298 +1397,650 @@ yyreduce: switch (yyn) { case 2: -#line 85 "parse.y" - {} +#line 224 "parse.y" + { + checkundefined(); + } break; - case 8: -#line 98 "parse.y" - { - Symbol *s = addsym(yyvsp[-2].name); + case 4: +#line 231 "parse.y" + { error_message("implicit tagging is not supported"); } + break; + + case 5: +#line 233 "parse.y" + { error_message("automatic tagging is not supported"); } + break; + + case 7: +#line 238 "parse.y" + { error_message("no extensibility options supported"); } + break; + + case 17: +#line 259 "parse.y" + { + struct string_list *sl; + for(sl = yyvsp[-3].sl; sl != NULL; sl = sl->next) { + Symbol *s = addsym(sl->string); s->stype = Stype; + } + add_import(yyvsp[-1].name); } break; - case 9: -#line 103 "parse.y" + case 22: +#line 278 "parse.y" { - Symbol *s = addsym(yyvsp[0].name); - s->stype = Stype; + yyval.sl = emalloc(sizeof(*yyval.sl)); + yyval.sl->string = yyvsp[-2].name; + yyval.sl->next = yyvsp[0].sl; } break; - case 10: -#line 110 "parse.y" - { add_import(yyvsp[-1].name); } + case 23: +#line 284 "parse.y" + { + yyval.sl = emalloc(sizeof(*yyval.sl)); + yyval.sl->string = yyvsp[0].name; + yyval.sl->next = NULL; + } break; - case 11: -#line 114 "parse.y" + case 24: +#line 292 "parse.y" { - Symbol *s = addsym (yyvsp[-2].name); - s->stype = Stype; - s->type = yyvsp[0].type; - generate_type (s); + Symbol *s = addsym (yyvsp[-2].name); + s->stype = Stype; + s->type = yyvsp[0].type; + fix_labels(s); + generate_type (s); } break; - case 12: -#line 123 "parse.y" + case 41: +#line 322 "parse.y" { - Symbol *s = addsym (yyvsp[-3].name); - s->stype = SConstant; - s->constant = yyvsp[0].constant; - generate_constant (s); + yyval.type = new_tag(ASN1_C_UNIV, UT_Boolean, + TE_EXPLICIT, new_type(TBoolean)); } break; - case 13: -#line 131 "parse.y" - { yyval.type = new_type(TInteger); } + case 42: +#line 329 "parse.y" + { + if(yyvsp[-3].value->type != integervalue || + yyvsp[-1].value->type != integervalue) + error_message("Non-integer value used in range"); + yyval.range.min = yyvsp[-3].value->u.integervalue; + yyval.range.max = yyvsp[-1].value->u.integervalue; + } break; - case 14: -#line 132 "parse.y" + case 43: +#line 339 "parse.y" { - if(yyvsp[-3].constant != 0) - error_message("Only 0 supported as low range"); - if(yyvsp[-1].constant != INT_MIN && yyvsp[-1].constant != UINT_MAX && yyvsp[-1].constant != INT_MAX) - error_message("Only %u supported as high range", - UINT_MAX); - yyval.type = new_type(TUInteger); + yyval.type = new_tag(ASN1_C_UNIV, UT_Integer, + TE_EXPLICIT, new_type(TInteger)); } break; - case 15: -#line 141 "parse.y" + case 44: +#line 344 "parse.y" { yyval.type = new_type(TInteger); - yyval.type->members = yyvsp[-1].member; - } + yyval.type->range = emalloc(sizeof(*yyval.type->range)); + *(yyval.type->range) = yyvsp[0].range; + yyval.type = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, yyval.type); + } + break; + + case 45: +#line 351 "parse.y" + { + yyval.type = new_type(TInteger); + yyval.type->members = yyvsp[-1].members; + yyval.type = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, yyval.type); + } break; - case 16: -#line 145 "parse.y" - { yyval.type = new_type(TOID); } + case 46: +#line 359 "parse.y" + { + yyval.members = emalloc(sizeof(*yyval.members)); + ASN1_TAILQ_INIT(yyval.members); + ASN1_TAILQ_INSERT_HEAD(yyval.members, yyvsp[0].member, members); + } break; - case 17: -#line 147 "parse.y" + case 47: +#line 365 "parse.y" + { + ASN1_TAILQ_INSERT_TAIL(yyvsp[-2].members, yyvsp[0].member, members); + yyval.members = yyvsp[-2].members; + } + break; + + case 48: +#line 370 "parse.y" + { yyval.members = yyvsp[-2].members; } + break; + + case 49: +#line 374 "parse.y" { - yyval.type = new_type(TEnumerated); - yyval.type->members = yyvsp[-1].member; + yyval.member = emalloc(sizeof(*yyval.member)); + yyval.member->name = yyvsp[-3].name; + yyval.member->gen_name = estrdup(yyvsp[-3].name); + output_name (yyval.member->gen_name); + yyval.member->val = yyvsp[-1].constant; + yyval.member->optional = 0; + yyval.member->ellipsis = 0; + yyval.member->type = NULL; } break; - case 18: -#line 151 "parse.y" - { yyval.type = new_type(TOctetString); } + case 50: +#line 387 "parse.y" + { + yyval.type = new_type(TInteger); + yyval.type->members = yyvsp[-1].members; + yyval.type = new_tag(ASN1_C_UNIV, UT_Enumerated, TE_EXPLICIT, yyval.type); + } break; - case 19: -#line 152 "parse.y" - { yyval.type = new_type(TGeneralString); } + case 52: +#line 398 "parse.y" + { + 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 20: -#line 153 "parse.y" - { yyval.type = new_type(TUTF8String); } + case 53: +#line 405 "parse.y" + { + yyval.type = new_type(TBitString); + yyval.type->members = yyvsp[-1].members; + yyval.type = new_tag(ASN1_C_UNIV, UT_BitString, TE_EXPLICIT, yyval.type); + } break; - case 21: -#line 154 "parse.y" - { yyval.type = new_type(TNull); } + case 54: +#line 413 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_OID, + TE_EXPLICIT, new_type(TOID)); + } break; - case 22: -#line 155 "parse.y" - { yyval.type = new_type(TGeneralizedTime); } + case 55: +#line 419 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_OctetString, + TE_EXPLICIT, new_type(TOctetString)); + } break; - case 23: -#line 157 "parse.y" + case 56: +#line 426 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_Null, + TE_EXPLICIT, new_type(TNull)); + } + break; + + case 57: +#line 433 "parse.y" + { + yyval.type = new_type(TSequence); + yyval.type->members = yyvsp[-1].members; + yyval.type = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, yyval.type); + } + break; + + case 58: +#line 439 "parse.y" + { + yyval.type = new_type(TSequence); + yyval.type->members = NULL; + yyval.type = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, yyval.type); + } + break; + + case 59: +#line 447 "parse.y" { yyval.type = new_type(TSequenceOf); yyval.type->subtype = yyvsp[0].type; + yyval.type = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, yyval.type); } break; - case 24: -#line 162 "parse.y" + case 60: +#line 455 "parse.y" { - yyval.type = new_type(TSequence); - yyval.type->members = yyvsp[-1].member; + yyval.type = new_type(TSet); + yyval.type->members = yyvsp[-1].members; + yyval.type = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, yyval.type); } break; - case 25: -#line 167 "parse.y" + case 61: +#line 461 "parse.y" { - yyval.type = new_type(TChoice); - yyval.type->members = yyvsp[-1].member; + yyval.type = new_type(TSet); + yyval.type->members = NULL; + yyval.type = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, yyval.type); } break; - case 26: -#line 172 "parse.y" + case 62: +#line 469 "parse.y" { - yyval.type = new_type(TBitString); - yyval.type->members = yyvsp[-1].member; + yyval.type = new_type(TSetOf); + yyval.type->subtype = yyvsp[0].type; + yyval.type = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, yyval.type); } break; - case 27: -#line 177 "parse.y" + case 63: +#line 477 "parse.y" + { + yyval.type = new_type(TChoice); + yyval.type->members = yyvsp[-1].members; + } + break; + + case 66: +#line 488 "parse.y" { Symbol *s = addsym(yyvsp[0].name); yyval.type = new_type(TType); - if(s->stype != Stype) + if(s->stype != Stype && s->stype != SUndefined) error_message ("%s is not a type\n", yyvsp[0].name); else yyval.type->symbol = s; } break; - case 28: -#line 186 "parse.y" + case 67: +#line 499 "parse.y" { - yyval.type = new_type(TApplication); - yyval.type->subtype = yyvsp[0].type; - yyval.type->application = yyvsp[-2].constant; + yyval.type = new_tag(ASN1_C_UNIV, UT_GeneralizedTime, + TE_EXPLICIT, new_type(TGeneralizedTime)); } break; - case 29: -#line 191 "parse.y" - { yyval.type = new_type(TBoolean); } + case 68: +#line 504 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_UTCTime, + TE_EXPLICIT, new_type(TUTCTime)); + } break; - case 30: -#line 194 "parse.y" - { yyval.member = NULL; } + case 69: +#line 511 "parse.y" + { + yyval.type = new_type(TTag); + yyval.type->tag = yyvsp[-2].tag; + yyval.type->tag.tagenv = yyvsp[-1].constant; + if(yyvsp[0].type->type == TTag && yyvsp[-1].constant == TE_IMPLICIT) { + yyval.type->subtype = yyvsp[0].type->subtype; + free(yyvsp[0].type); + } else + yyval.type->subtype = yyvsp[0].type; + } break; - case 31: -#line 195 "parse.y" - { yyval.member = yyvsp[0].member; } + case 70: +#line 524 "parse.y" + { + yyval.tag.tagclass = yyvsp[-2].constant; + yyval.tag.tagvalue = yyvsp[-1].constant; + yyval.tag.tagenv = TE_EXPLICIT; + } break; - case 32: -#line 196 "parse.y" - { yyval.member = yyvsp[-2].member; } + case 71: +#line 532 "parse.y" + { + yyval.constant = ASN1_C_CONTEXT; + } break; - case 33: -#line 197 "parse.y" - { yyval.member = yyvsp[-2].member; append(yyval.member, yyvsp[0].member); } + case 72: +#line 536 "parse.y" + { + yyval.constant = ASN1_C_UNIV; + } break; - case 34: -#line 201 "parse.y" + case 73: +#line 540 "parse.y" { - yyval.member = malloc(sizeof(*yyval.member)); - yyval.member->name = yyvsp[-4].name; - yyval.member->gen_name = strdup(yyvsp[-4].name); - output_name (yyval.member->gen_name); - yyval.member->val = yyvsp[-2].constant; - yyval.member->optional = 0; - yyval.member->defval = NULL; - yyval.member->type = yyvsp[0].type; - yyval.member->next = yyval.member->prev = yyval.member; + yyval.constant = ASN1_C_APPL; } break; - case 35: -#line 216 "parse.y" - { yyvsp[-1].member->optional = yyvsp[0].constant ; yyval.member = yyvsp[-1].member; } + case 74: +#line 544 "parse.y" + { + yyval.constant = ASN1_C_PRIVATE; + } break; - case 36: -#line 218 "parse.y" - { yyvsp[-1].member->defval = yyvsp[0].defval ; yyval.member = yyvsp[-1].member; } + case 75: +#line 550 "parse.y" + { + yyval.constant = TE_EXPLICIT; + } break; - case 37: -#line 220 "parse.y" - { yyval.member = yyvsp[0].member; } + case 76: +#line 554 "parse.y" + { + yyval.constant = TE_EXPLICIT; + } break; - case 38: -#line 224 "parse.y" - { yyval.constant = 1; } + case 77: +#line 558 "parse.y" + { + yyval.constant = TE_IMPLICIT; + } break; - case 39: -#line 228 "parse.y" - { asprintf(&yyval.defval, "%d", yyvsp[0].constant); } + case 78: +#line 565 "parse.y" + { + Symbol *s; + s = addsym (yyvsp[-3].name); + + s->stype = SValue; + s->value = yyvsp[0].value; + generate_constant (s); + } break; - case 40: -#line 230 "parse.y" - { yyval.defval = strdup (yyvsp[-1].name); } + case 80: +#line 579 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_GeneralString, + TE_EXPLICIT, new_type(TGeneralString)); + } break; - case 41: -#line 233 "parse.y" - { yyval.member = NULL; } + case 81: +#line 584 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_UTF8String, + TE_EXPLICIT, new_type(TUTF8String)); + } break; - case 42: -#line 234 "parse.y" - { yyval.member = yyvsp[0].member; } + case 82: +#line 589 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_PrintableString, + TE_EXPLICIT, new_type(TPrintableString)); + } break; - case 43: -#line 235 "parse.y" - { yyval.member = yyvsp[-2].member; } + case 83: +#line 594 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_IA5String, + TE_EXPLICIT, new_type(TIA5String)); + } break; - case 44: -#line 236 "parse.y" - { yyval.member = yyvsp[-2].member; append(yyval.member, yyvsp[0].member); } + case 84: +#line 599 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_BMPString, + TE_EXPLICIT, new_type(TBMPString)); + } break; - case 45: -#line 240 "parse.y" + case 85: +#line 604 "parse.y" + { + yyval.type = new_tag(ASN1_C_UNIV, UT_UniversalString, + TE_EXPLICIT, new_type(TUniversalString)); + } + break; + + case 86: +#line 612 "parse.y" + { + yyval.members = emalloc(sizeof(*yyval.members)); + ASN1_TAILQ_INIT(yyval.members); + ASN1_TAILQ_INSERT_HEAD(yyval.members, yyvsp[0].member, members); + } + break; + + case 87: +#line 618 "parse.y" { - yyval.member = malloc(sizeof(*yyval.member)); + ASN1_TAILQ_INSERT_TAIL(yyvsp[-2].members, yyvsp[0].member, members); + yyval.members = yyvsp[-2].members; + } + break; + + case 88: +#line 623 "parse.y" + { + struct member *m = ecalloc(1, sizeof(*m)); + m->name = estrdup("..."); + m->gen_name = estrdup("asn1_ellipsis"); + m->ellipsis = 1; + ASN1_TAILQ_INSERT_TAIL(yyvsp[-2].members, m, members); + yyval.members = yyvsp[-2].members; + } + break; + + case 89: +#line 634 "parse.y" + { + yyval.member = emalloc(sizeof(*yyval.member)); + yyval.member->name = yyvsp[-1].name; + yyval.member->gen_name = estrdup(yyvsp[-1].name); + output_name (yyval.member->gen_name); + yyval.member->type = yyvsp[0].type; + yyval.member->ellipsis = 0; + } + break; + + case 90: +#line 645 "parse.y" + { + yyval.member = yyvsp[0].member; + yyval.member->optional = 0; + yyval.member->defval = NULL; + } + break; + + case 91: +#line 651 "parse.y" + { + yyval.member = yyvsp[-1].member; + yyval.member->optional = 1; + yyval.member->defval = NULL; + } + break; + + case 92: +#line 657 "parse.y" + { + yyval.member = yyvsp[-2].member; + yyval.member->optional = 0; + yyval.member->defval = yyvsp[0].value; + } + break; + + case 93: +#line 665 "parse.y" + { + yyval.members = emalloc(sizeof(*yyval.members)); + ASN1_TAILQ_INIT(yyval.members); + ASN1_TAILQ_INSERT_HEAD(yyval.members, yyvsp[0].member, members); + } + break; + + case 94: +#line 671 "parse.y" + { + ASN1_TAILQ_INSERT_TAIL(yyvsp[-2].members, yyvsp[0].member, members); + yyval.members = yyvsp[-2].members; + } + break; + + case 95: +#line 678 "parse.y" + { + yyval.member = emalloc(sizeof(*yyval.member)); yyval.member->name = yyvsp[-3].name; - yyval.member->gen_name = strdup(yyvsp[-3].name); + yyval.member->gen_name = estrdup(yyvsp[-3].name); output_name (yyval.member->gen_name); yyval.member->val = yyvsp[-1].constant; yyval.member->optional = 0; + yyval.member->ellipsis = 0; yyval.member->type = NULL; - yyval.member->prev = yyval.member->next = yyval.member; } break; - case 46: -#line 252 "parse.y" - { yyval.constant = yyvsp[0].constant; } + case 97: +#line 691 "parse.y" + { yyval.objid = NULL; } break; - case 47: -#line 253 "parse.y" - { yyval.constant = -yyvsp[0].constant; } + case 98: +#line 695 "parse.y" + { + yyval.objid = yyvsp[-1].objid; + } break; - case 48: -#line 254 "parse.y" + case 99: +#line 701 "parse.y" + { + yyval.objid = NULL; + } + break; + + case 100: +#line 705 "parse.y" + { + if (yyvsp[0].objid) { + yyval.objid = yyvsp[0].objid; + add_oid_to_tail(yyvsp[0].objid, yyvsp[-1].objid); + } else { + yyval.objid = yyvsp[-1].objid; + } + } + break; + + case 101: +#line 716 "parse.y" + { + yyval.objid = new_objid(yyvsp[-3].name, yyvsp[-1].constant); + } + break; + + case 102: +#line 720 "parse.y" + { + Symbol *s = addsym(yyvsp[0].name); + if(s->stype != SValue || + s->value->type != objectidentifiervalue) { + error_message("%s is not an object identifier\n", + s->name); + exit(1); + } + yyval.objid = s->value->u.objectidentifiervalue; + } + break; + + case 103: +#line 731 "parse.y" + { + yyval.objid = new_objid(NULL, yyvsp[0].constant); + } + break; + + case 113: +#line 754 "parse.y" { - Symbol *s = addsym(yyvsp[0].name); - if(s->stype != SConstant) - error_message ("%s is not a constant\n", - s->name); - else - yyval.constant = s->constant; - } + Symbol *s = addsym(yyvsp[0].name); + if(s->stype != SValue) + error_message ("%s is not a value\n", + s->name); + else + yyval.value = s->value; + } + break; + + case 114: +#line 765 "parse.y" + { + yyval.value = emalloc(sizeof(*yyval.value)); + yyval.value->type = stringvalue; + yyval.value->u.stringvalue = yyvsp[0].name; + } + break; + + case 115: +#line 773 "parse.y" + { + yyval.value = emalloc(sizeof(*yyval.value)); + yyval.value->type = booleanvalue; + yyval.value->u.booleanvalue = 0; + } + break; + + case 116: +#line 779 "parse.y" + { + yyval.value = emalloc(sizeof(*yyval.value)); + yyval.value->type = booleanvalue; + yyval.value->u.booleanvalue = 0; + } + break; + + case 117: +#line 787 "parse.y" + { + yyval.value = emalloc(sizeof(*yyval.value)); + yyval.value->type = integervalue; + yyval.value->u.integervalue = yyvsp[0].constant; + } + break; + + case 119: +#line 798 "parse.y" + { + } + break; + + case 120: +#line 803 "parse.y" + { + yyval.value = emalloc(sizeof(*yyval.value)); + yyval.value->type = objectidentifiervalue; + yyval.value->u.objectidentifiervalue = yyvsp[0].objid; + } break; } -/* Line 1010 of yacc.c. */ -#line 1431 "$base.c" +/* Line 1000 of yacc.c. */ +#line 2044 "parse.c" yyvsp -= yylen; yyssp -= yylen; @@ -1652,7 +2265,7 @@ yyreturn: } -#line 263 "parse.y" +#line 810 "parse.y" void @@ -1662,28 +2275,81 @@ yyerror (char *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 = malloc(sizeof(*t)); - if (t == NULL) { - error_message ("out of memory in malloc(%lu)", - (unsigned long)sizeof(*t)); - exit (1); - } - t->type = tt; - t->application = 0; - t->members = NULL; - t->subtype = NULL; - t->symbol = NULL; - return t; + Type *t = ecalloc(1, sizeof(*t)); + t->type = tt; + return t; +} + +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) { + asprintf(&m->label, "%s_%s", prefix, m->gen_name); + 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 -append (Member *l, Member *r) +fix_labels(Symbol *s) { - l->prev->next = r; - r->prev = l->prev; - l->prev = r; - r->next = l; + char *p; + asprintf(&p, "choice_%s", s->gen_name); + if (p == NULL) + errx(1, "malloc"); + fix_labels2(s->type, p); + free(p); } |