summaryrefslogtreecommitdiff
path: root/source4/heimdal/lib/asn1/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/heimdal/lib/asn1/parse.c')
-rw-r--r--source4/heimdal/lib/asn1/parse.c1444
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);
}