libtasn1-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU libtasn1 branch, master, updated. libtasn1_3_0-13-g3b545f0


From: Nikos Mavrogiannopoulos
Subject: [SCM] GNU libtasn1 branch, master, updated. libtasn1_3_0-13-g3b545f0
Date: Thu, 22 Nov 2012 18:13:35 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU libtasn1".

http://git.savannah.gnu.org/cgit/libtasn1.git/commit/?id=3b545f01f74778112769ef1a1225324d6428423a

The branch, master has been updated
       via  3b545f01f74778112769ef1a1225324d6428423a (commit)
       via  19c67083e19f4618f4401cd4fcdee199f985a927 (commit)
       via  311898c383b794d46e076d3e60952663b2e50b5c (commit)
       via  63db52e21259ccb3910978af1d60d75699f478c0 (commit)
      from  a26e0f5c84405ba760022749984bb73f1d548431 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 3b545f01f74778112769ef1a1225324d6428423a
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Thu Nov 22 19:13:30 2012 +0100

    documented updates

commit 19c67083e19f4618f4401cd4fcdee199f985a927
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Thu Nov 22 19:09:56 2012 +0100

    indented C code in ASN1.y, and added more verbose error reporting.

commit 311898c383b794d46e076d3e60952663b2e50b5c
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Thu Nov 22 18:23:34 2012 +0100

    idented code

commit 63db52e21259ccb3910978af1d60d75699f478c0
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Thu Nov 22 01:41:31 2012 +0100

    Added more ASN.1 string types and several simplifications.

-----------------------------------------------------------------------

Summary of changes:
 NEWS                |    4 +
 lib/ASN1.c          | 1622 ++++++++++++++++++++++++++++++---------------------
 lib/ASN1.y          |  762 ++++++++++++++-----------
 lib/coding.c        |  205 +++----
 lib/decoding.c      |  299 ++++------
 lib/element.c       |  176 +++---
 lib/int.h           |   32 +-
 lib/libtasn1.h      |   18 +-
 lib/parser_aux.c    |   44 +-
 lib/structure.c     |  152 +++--
 tests/Test_parser.c |   11 +-
 11 files changed, 1821 insertions(+), 1504 deletions(-)

diff --git a/NEWS b/NEWS
index d2503bb..9997ea1 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,10 @@ GNU Libtasn1 NEWS                                     -*- 
outline -*-
 * Noteworthy changes in release 3.1 (unreleased) [stable]
 - Completed rename of types:
   ASN1_ARRAY_TYPE -> asn1_static_node (was asn1_static_node_t)
+- Added new types: VisibleString, NumericString, IA5String, TeletexString,
+  PrintableString, UniversalString, BMPString, UTF8String. When re-defined
+  a warning is being instead of failing.
+- Parser outputs more detailed syntax error message.
 
 * Noteworthy changes in release 3.0 (2012-10-28) [stable]
 - Added tool in tests/ to benchmark X.509 structure decoding.
diff --git a/lib/ASN1.c b/lib/ASN1.c
index 1aaca9a..67d2f04 100644
--- a/lib/ASN1.c
+++ b/lib/ASN1.c
@@ -107,29 +107,31 @@
 #include <int.h>
 #include <parser_aux.h>
 #include <structure.h>
+#include <libtasn1.h>
 
 static FILE *file_asn1;                        /* Pointer to file to parse */
-static int result_parse;       /* result of the parser
+static int result_parse = 0;   /* result of the parser
                                           algorithm */
 static asn1_node p_tree;               /* pointer to the root of the
                                           structure created by the
                                           parser*/
-static unsigned long lineNumber;       /* line number describing the
+static unsigned int line_number;       /* line number describing the
                                           parser position inside the
                                           file */
-static char lastToken[ASN1_MAX_NAME_SIZE+1];   /* last token find in the file
+static char last_error[ASN1_MAX_ERROR_DESCRIPTION_SIZE] = "";
+static char last_token[ASN1_MAX_NAME_SIZE+1];  /* last token find in the file
                                           to parse before the 'parse
                                           error' */
 extern char _asn1_identifierMissing[];
-static const char *fileName;           /* file to parse */
+static const char *file_name;          /* file to parse */
 
-static int _asn1_yyerror (const char *);
+static void _asn1_yyerror (const char *);
 static int _asn1_yylex(void);
 
 
 
 /* Line 268 of yacc.c  */
-#line 133 "ASN1.c"
+#line 135 "ASN1.c"
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
@@ -141,7 +143,7 @@ static int _asn1_yylex(void);
 # undef YYERROR_VERBOSE
 # define YYERROR_VERBOSE 1
 #else
-# define YYERROR_VERBOSE 0
+# define YYERROR_VERBOSE 1
 #endif
 
 /* Enabling the token table.  */
@@ -191,9 +193,17 @@ static int _asn1_yylex(void);
      UTCTime = 290,
      GeneralizedTime = 291,
      GeneralString = 292,
-     FROM = 293,
-     IMPORTS = 294,
-     ENUMERATED = 295
+     NumericString = 293,
+     IA5String = 294,
+     TeletexString = 295,
+     PrintableString = 296,
+     UniversalString = 297,
+     BMPString = 298,
+     UTF8String = 299,
+     VisibleString = 300,
+     FROM = 301,
+     IMPORTS = 302,
+     ENUMERATED = 303
    };
 #endif
 /* Tokens.  */
@@ -232,9 +242,17 @@ static int _asn1_yylex(void);
 #define UTCTime 290
 #define GeneralizedTime 291
 #define GeneralString 292
-#define FROM 293
-#define IMPORTS 294
-#define ENUMERATED 295
+#define NumericString 293
+#define IA5String 294
+#define TeletexString 295
+#define PrintableString 296
+#define UniversalString 297
+#define BMPString 298
+#define UTF8String 299
+#define VisibleString 300
+#define FROM 301
+#define IMPORTS 302
+#define ENUMERATED 303
 
 
 
@@ -244,7 +262,7 @@ typedef union YYSTYPE
 {
 
 /* Line 293 of yacc.c  */
-#line 57 "ASN1.y"
+#line 61 "ASN1.y"
 
   unsigned int constant;
   char str[ASN1_MAX_NAME_SIZE+1];
@@ -253,7 +271,7 @@ typedef union YYSTYPE
 
 
 /* Line 293 of yacc.c  */
-#line 257 "ASN1.c"
+#line 275 "ASN1.c"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -265,7 +283,7 @@ typedef union YYSTYPE
 
 
 /* Line 343 of yacc.c  */
-#line 269 "ASN1.c"
+#line 287 "ASN1.c"
 
 #ifdef short
 # undef short
@@ -484,20 +502,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  5
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   192
+#define YYLAST   217
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  52
+#define YYNTOKENS  60
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  43
+#define YYNNTS  51
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  100
+#define YYNRULES  125
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  190
+#define YYNSTATES  216
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   295
+#define YYMAXUTOK   303
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -509,15 +527,15 @@ static const yytype_uint8 yytranslate[] =
        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,
-      43,    44,     2,    41,    45,    42,    51,     2,     2,     2,
+      51,    52,     2,    49,    53,    50,    59,     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,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,    46,     2,    47,     2,     2,     2,     2,     2,     2,
+       2,    54,     2,    55,     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,    49,    48,    50,     2,     2,     2,     2,
+       2,     2,     2,    57,    56,    58,     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,
@@ -534,7 +552,8 @@ static const yytype_uint8 yytranslate[] =
        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,    32,    33,    34,
-      35,    36,    37,    38,    39,    40
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48
 };
 
 #if YYDEBUG
@@ -546,67 +565,77 @@ static const yytype_uint16 yyprhs[] =
       28,    30,    32,    36,    41,    43,    47,    49,    54,    56,
       59,    61,    63,    65,    69,    74,    76,    79,    82,    85,
       88,    91,    93,    97,    99,   104,   109,   117,   119,   121,
-     123,   128,   136,   138,   142,   144,   147,   150,   154,   159,
-     161,   165,   168,   172,   178,   183,   186,   188,   191,   193,
-     195,   197,   199,   201,   203,   205,   207,   209,   211,   213,
-     215,   217,   219,   222,   224,   227,   230,   233,   235,   239,
-     244,   248,   253,   258,   262,   267,   272,   274,   279,   283,
-     291,   298,   303,   305,   307,   309,   312,   317,   321,   323,
-     325
+     123,   128,   136,   138,   142,   144,   147,   149,   152,   154,
+     157,   159,   162,   164,   167,   169,   172,   174,   177,   179,
+     182,   184,   187,   190,   194,   199,   201,   205,   208,   212,
+     218,   223,   226,   228,   231,   233,   235,   237,   239,   241,
+     243,   245,   247,   249,   251,   253,   255,   257,   259,   261,
+     263,   265,   267,   269,   271,   273,   275,   278,   280,   283,
+     286,   289,   291,   295,   300,   304,   309,   314,   318,   323,
+     328,   330,   335,   339,   342,   350,   357,   362,   364,   366,
+     368,   371,   376,   380,   382,   384
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int8 yyrhs[] =
 {
-      53,     0,    -1,    93,    31,    94,    32,     3,    33,    92,
-      34,    -1,     4,    -1,    41,     4,    -1,    42,     4,    -1,
-      54,    -1,    55,    -1,     4,    -1,     5,    -1,    56,    -1,
-       5,    -1,    43,    56,    44,    -1,     5,    43,    56,    44,
-      -1,    59,    -1,    60,    45,    59,    -1,    57,    -1,     5,
-      43,     4,    44,    -1,    61,    -1,    62,    61,    -1,    13,
-      -1,    14,    -1,    15,    -1,    46,     4,    47,    -1,    46,
-      63,     4,    47,    -1,    64,    -1,    64,    29,    -1,    64,
-      30,    -1,    16,    58,    -1,    16,    22,    -1,    16,    23,
-      -1,    56,    -1,    67,    48,    56,    -1,     7,    -1,     7,
-      49,    60,    50,    -1,    68,    43,    67,    44,    -1,    68,
-      43,    57,    51,    51,    57,    44,    -1,    21,    -1,    35,
-      -1,    36,    -1,     8,    43,    57,    44,    -1,     8,    43,
-      57,    51,    51,    57,    44,    -1,    71,    -1,    43,    71,
-      44,    -1,    37,    -1,    37,    72,    -1,     9,    10,    -1,
-       9,    10,    72,    -1,     5,    43,     4,    44,    -1,    75,
-      -1,    76,    45,    75,    -1,    12,    10,    -1,    12,    10,
-      72,    -1,    12,    10,    49,    76,    50,    -1,    40,    49,
-      76,    50,    -1,    19,    20,    -1,     5,    -1,     5,    72,
-      -1,    68,    -1,    78,    -1,    69,    -1,    70,    -1,    74,
-      -1,    77,    -1,    73,    -1,    85,    -1,    79,    -1,    87,
-      -1,    88,    -1,    86,    -1,    24,    -1,    80,    -1,    65,
-      80,    -1,    81,    -1,    81,    66,    -1,    81,     6,    -1,
-       5,    82,    -1,    83,    -1,    84,    45,    83,    -1,    11,
-      49,    84,    50,    -1,    11,    18,    80,    -1,    11,    72,
-      18,    80,    -1,    28,    49,    84,    50,    -1,    28,    18,
-      80,    -1,    28,    72,    18,    80,    -1,    17,    49,    84,
-      50,    -1,    25,    -1,    25,    26,    27,     5,    -1,     5,
-       3,    81,    -1,     5,    19,    20,     3,    49,    62,    50,
-      -1,     5,     5,     3,    49,    62,    50,    -1,     5,     7,
-       3,    56,    -1,    89,    -1,    90,    -1,    91,    -1,    92,
-      91,    -1,     5,    49,    62,    50,    -1,     5,    49,    50,
-      -1,     5,    -1,    29,    -1,    30,    -1
+      61,     0,    -1,   109,    31,   110,    32,     3,    33,   108,
+      34,    -1,     4,    -1,    49,     4,    -1,    50,     4,    -1,
+      62,    -1,    63,    -1,     4,    -1,     5,    -1,    64,    -1,
+       5,    -1,    51,    64,    52,    -1,     5,    51,    64,    52,
+      -1,    67,    -1,    68,    53,    67,    -1,    65,    -1,     5,
+      51,     4,    52,    -1,    69,    -1,    70,    69,    -1,    13,
+      -1,    14,    -1,    15,    -1,    54,     4,    55,    -1,    54,
+      71,     4,    55,    -1,    72,    -1,    72,    29,    -1,    72,
+      30,    -1,    16,    66,    -1,    16,    22,    -1,    16,    23,
+      -1,    64,    -1,    75,    56,    64,    -1,     7,    -1,     7,
+      57,    68,    58,    -1,    76,    51,    75,    52,    -1,    76,
+      51,    65,    59,    59,    65,    52,    -1,    21,    -1,    35,
+      -1,    36,    -1,     8,    51,    65,    52,    -1,     8,    51,
+      65,    59,    59,    65,    52,    -1,    79,    -1,    51,    79,
+      52,    -1,    37,    -1,    37,    80,    -1,    38,    -1,    38,
+      80,    -1,    39,    -1,    39,    80,    -1,    40,    -1,    40,
+      80,    -1,    41,    -1,    41,    80,    -1,    42,    -1,    42,
+      80,    -1,    43,    -1,    43,    80,    -1,    44,    -1,    44,
+      80,    -1,    45,    -1,    45,    80,    -1,     9,    10,    -1,
+       9,    10,    80,    -1,     5,    51,     4,    52,    -1,    91,
+      -1,    92,    53,    91,    -1,    12,    10,    -1,    12,    10,
+      80,    -1,    12,    10,    57,    92,    58,    -1,    48,    57,
+      92,    58,    -1,    19,    20,    -1,     5,    -1,     5,    80,
+      -1,    76,    -1,    94,    -1,    77,    -1,    78,    -1,    90,
+      -1,    93,    -1,    81,    -1,    82,    -1,    83,    -1,    84,
+      -1,    85,    -1,    86,    -1,    87,    -1,    88,    -1,    89,
+      -1,   101,    -1,    95,    -1,   103,    -1,   104,    -1,   102,
+      -1,    24,    -1,    96,    -1,    73,    96,    -1,    97,    -1,
+      97,    74,    -1,    97,     6,    -1,     5,    98,    -1,    99,
+      -1,   100,    53,    99,    -1,    11,    57,   100,    58,    -1,
+      11,    18,    96,    -1,    11,    80,    18,    96,    -1,    28,
+      57,   100,    58,    -1,    28,    18,    96,    -1,    28,    80,
+      18,    96,    -1,    17,    57,   100,    58,    -1,    25,    -1,
+      25,    26,    27,     5,    -1,     5,     3,    97,    -1,     1,
+      97,    -1,     5,    19,    20,     3,    57,    70,    58,    -1,
+       5,     5,     3,    57,    70,    58,    -1,     5,     7,     3,
+      64,    -1,   105,    -1,   106,    -1,   107,    -1,   108,   107,
+      -1,     5,    57,    70,    58,    -1,     5,    57,    58,    -1,
+       5,    -1,    29,    -1,    30,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   118,   118,   131,   132,   135,   139,   140,   143,   144,
-     147,   148,   151,   153,   158,   159,   163,   165,   170,   171,
-     175,   176,   177,   180,   182,   186,   187,   188,   191,   193,
-     194,   198,   199,   203,   204,   206,   207,   214,   217,   218,
-     221,   223,   229,   230,   233,   234,   238,   239,   243,   248,
-     249,   253,   254,   255,   260,   266,   269,   271,   274,   275,
-     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   289,   290,   295,   296,   299,   302,   305,   306,   310,
-     312,   314,   319,   321,   323,   328,   332,   333,   338,   341,
-     345,   350,   356,   357,   360,   361,   365,   368,   370,   394,
-     395
+       0,   133,   133,   146,   147,   150,   154,   155,   158,   159,
+     162,   163,   166,   168,   173,   174,   178,   180,   185,   186,
+     190,   191,   192,   195,   197,   201,   202,   203,   206,   208,
+     209,   213,   214,   218,   219,   221,   222,   229,   232,   233,
+     236,   238,   244,   245,   248,   249,   253,   254,   258,   259,
+     263,   264,   268,   269,   273,   274,   278,   279,   283,   284,
+     288,   289,   293,   294,   298,   303,   304,   308,   309,   310,
+     315,   321,   324,   326,   329,   330,   331,   332,   333,   334,
+     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
+     345,   346,   347,   348,   349,   352,   353,   358,   359,   362,
+     365,   368,   369,   373,   375,   377,   382,   384,   386,   391,
+     395,   396,   401,   403,   406,   410,   415,   421,   422,   425,
+     426,   430,   433,   435,   459,   460
 };
 #endif
 
@@ -621,19 +650,23 @@ static const char *const yytname[] =
   "OBJECT", "STR_IDENTIFIER", "BOOLEAN", "ASN1_TRUE", "ASN1_FALSE",
   "TOKEN_NULL", "ANY", "DEFINED", "BY", "SET", "EXPLICIT", "IMPLICIT",
   "DEFINITIONS", "TAGS", "BEGIN", "END", "UTCTime", "GeneralizedTime",
-  "GeneralString", "FROM", "IMPORTS", "ENUMERATED", "'+'", "'-'", "'('",
+  "GeneralString", "NumericString", "IA5String", "TeletexString",
+  "PrintableString", "UniversalString", "BMPString", "UTF8String",
+  "VisibleString", "FROM", "IMPORTS", "ENUMERATED", "'+'", "'-'", "'('",
   "')'", "','", "'['", "']'", "'|'", "'{'", "'}'", "'.'", "$accept",
   "definitions", "pos_num", "neg_num", "pos_neg_num", "num_identifier",
   "pos_neg_identifier", "constant", "constant_list", "obj_constant",
   "obj_constant_list", "class", "tag_type", "tag", "default",
   "pos_neg_list", "integer_def", "boolean_def", "Time", "size_def2",
-  "size_def", "generalstring_def", "octet_string_def", "bit_element",
-  "bit_element_list", "bit_string_def", "enumerated_def", "object_def",
-  "type_assig_right", "type_assig_right_tag",
-  "type_assig_right_tag_default", "type_assig", "type_assig_list",
-  "sequence_def", "set_def", "choise_def", "any_def", "type_def",
-  "constant_def", "type_constant", "type_constant_list", "definitions_id",
-  "explicit_implicit", 0
+  "size_def", "generalstring_def", "numericstring_def", "ia5string_def",
+  "teletexstring_def", "printablestring_def", "universalstring_def",
+  "bmpstring_def", "utf8string_def", "visiblestring_def",
+  "octet_string_def", "bit_element", "bit_element_list", "bit_string_def",
+  "enumerated_def", "object_def", "type_assig_right",
+  "type_assig_right_tag", "type_assig_right_tag_default", "type_assig",
+  "type_assig_list", "sequence_def", "set_def", "choise_def", "any_def",
+  "type_def", "constant_def", "type_constant", "type_constant_list",
+  "definitions_id", "explicit_implicit", 0
 };
 #endif
 
@@ -646,25 +679,27 @@ static const yytype_uint16 yytoknum[] =
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,    43,    45,    40,    41,    44,    91,    93,   124,   123,
-     125,    46
+     295,   296,   297,   298,   299,   300,   301,   302,   303,    43,
+      45,    40,    41,    44,    91,    93,   124,   123,   125,    46
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    52,    53,    54,    54,    55,    56,    56,    57,    57,
-      58,    58,    59,    59,    60,    60,    61,    61,    62,    62,
-      63,    63,    63,    64,    64,    65,    65,    65,    66,    66,
-      66,    67,    67,    68,    68,    68,    68,    69,    70,    70,
-      71,    71,    72,    72,    73,    73,    74,    74,    75,    76,
-      76,    77,    77,    77,    78,    79,    80,    80,    80,    80,
-      80,    80,    80,    80,    80,    80,    80,    80,    80,    80,
-      80,    81,    81,    82,    82,    82,    83,    84,    84,    85,
-      85,    85,    86,    86,    86,    87,    88,    88,    89,    90,
-      90,    90,    91,    91,    92,    92,    93,    93,    93,    94,
-      94
+       0,    60,    61,    62,    62,    63,    64,    64,    65,    65,
+      66,    66,    67,    67,    68,    68,    69,    69,    70,    70,
+      71,    71,    71,    72,    72,    73,    73,    73,    74,    74,
+      74,    75,    75,    76,    76,    76,    76,    77,    78,    78,
+      79,    79,    80,    80,    81,    81,    82,    82,    83,    83,
+      84,    84,    85,    85,    86,    86,    87,    87,    88,    88,
+      89,    89,    90,    90,    91,    92,    92,    93,    93,    93,
+      94,    95,    96,    96,    96,    96,    96,    96,    96,    96,
+      96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+      96,    96,    96,    96,    96,    97,    97,    98,    98,    98,
+      99,   100,   100,   101,   101,   101,   102,   102,   102,   103,
+     104,   104,   105,   105,   106,   106,   106,   107,   107,   108,
+     108,   109,   109,   109,   110,   110
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -674,13 +709,15 @@ static const yytype_uint8 yyr2[] =
        1,     1,     3,     4,     1,     3,     1,     4,     1,     2,
        1,     1,     1,     3,     4,     1,     2,     2,     2,     2,
        2,     1,     3,     1,     4,     4,     7,     1,     1,     1,
-       4,     7,     1,     3,     1,     2,     2,     3,     4,     1,
-       3,     2,     3,     5,     4,     2,     1,     2,     1,     1,
+       4,     7,     1,     3,     1,     2,     1,     2,     1,     2,
+       1,     2,     1,     2,     1,     2,     1,     2,     1,     2,
+       1,     2,     2,     3,     4,     1,     3,     2,     3,     5,
+       4,     2,     1,     2,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     2,     1,     2,     2,     2,     1,     3,     4,
-       3,     4,     4,     3,     4,     4,     1,     4,     3,     7,
-       6,     4,     1,     1,     1,     2,     4,     3,     1,     1,
-       1
+       1,     1,     1,     1,     1,     1,     2,     1,     2,     2,
+       2,     1,     3,     4,     3,     4,     4,     3,     4,     4,
+       1,     4,     3,     2,     7,     6,     4,     1,     1,     1,
+       2,     4,     3,     1,     1,     1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
@@ -688,71 +725,79 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       0,    98,     0,     0,     0,     1,     0,     8,     9,    97,
-      16,    18,     0,    99,   100,     0,     0,    96,    19,     0,
-       0,     0,    17,     0,     0,    92,    93,    94,     0,     0,
-       0,     0,     0,     2,    95,    56,    33,     0,     0,     0,
-       0,     0,    37,    70,    86,     0,    38,    39,    44,     0,
-       0,    25,     0,    58,    60,    61,    64,    62,    63,    59,
-      66,    71,    88,    65,    69,    67,    68,     0,     0,     0,
-       0,     0,    42,    57,     0,    46,     0,     0,     0,    51,
-       0,    55,     0,     0,     0,     0,    45,     0,     0,    20,
-      21,    22,     0,    26,    27,    72,     0,     0,     3,     0,
-       0,     6,     7,    91,     0,     0,     0,     0,     0,    14,
-       0,    47,    80,     0,    77,     0,     0,     0,    52,     0,
-       0,    83,     0,     0,     0,    49,     0,    23,     0,     3,
-       9,    31,     0,     0,     0,     4,     5,     0,     0,    43,
-       0,     0,     0,    34,    73,    76,     0,    79,    81,     0,
-      85,    87,    82,    84,     0,     0,    54,    24,     0,    35,
-       0,    90,     0,    40,     0,     0,    12,    15,    75,     0,
-      74,    78,    53,     0,    50,     0,    32,    89,     0,    13,
-      11,    29,    30,    10,    28,    48,     0,     0,    36,    41
+       0,   123,     0,     0,     0,     1,     0,     8,     9,   122,
+      16,    18,     0,   124,   125,     0,     0,   121,    19,     0,
+       0,     0,    17,     0,     0,     0,   117,   118,   119,     0,
+      72,    33,     0,     0,     0,     0,     0,    37,    94,   110,
+       0,    38,    39,    44,    46,    48,    50,    52,    54,    56,
+      58,    60,     0,     0,    25,     0,    74,    76,    77,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    78,    79,
+      75,    90,    95,   113,    89,    93,    91,    92,     0,     0,
+       0,     0,     2,   120,     0,     0,    42,    73,     0,    62,
+       0,     0,     0,    67,     0,    71,     0,     0,     0,     0,
+      45,    47,    49,    51,    53,    55,    57,    59,    61,     0,
+       0,    20,    21,    22,     0,    26,    27,    96,     0,   112,
+       0,     0,     0,     0,     0,     0,     0,    14,     0,    63,
+     104,     0,   101,     0,     0,     0,    68,     0,     0,   107,
+       0,     0,     0,    65,     0,    23,     0,     3,     9,     0,
+       0,     6,     7,    31,     0,     0,     0,     3,   116,     0,
+       0,    43,     0,     0,     0,    34,    97,   100,     0,   103,
+     105,     0,   109,   111,   106,   108,     0,     0,    70,    24,
+       4,     5,     0,    35,     0,     0,     0,    40,     0,     0,
+      12,    15,    99,     0,    98,   102,    69,     0,    66,     0,
+      32,   115,     0,     0,    13,    11,    29,    30,    10,    28,
+      64,     0,   114,     0,    36,    41
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     2,   101,   102,   103,    10,   184,   109,   110,    11,
-      12,    92,    51,    52,   170,   133,    53,    54,    55,    72,
-      73,    56,    57,   125,   126,    58,    59,    60,    61,    62,
-     145,   114,   115,    63,    64,    65,    66,    25,    26,    27,
-      28,     3,    15
+      -1,     2,   151,   152,   153,    10,   209,   127,   128,    11,
+      12,   114,    54,    55,   194,   155,    56,    57,    58,    86,
+      87,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,   143,   144,    69,    70,    71,    72,    73,   167,   132,
+     133,    74,    75,    76,    77,    26,    27,    28,    29,     3,
+      15
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -96
+#define YYPACT_NINF -118
 static const yytype_int16 yypact[] =
 {
-      24,   -14,    48,    56,     0,   -96,   -10,   -96,    -2,   -96,
-     -96,   -96,     2,   -96,   -96,    71,   111,   -96,   -96,   117,
-      83,    96,   -96,   127,    42,   -96,   -96,   -96,    10,    77,
-     130,   131,   115,   -96,   -96,     8,    90,   132,    13,   135,
-      92,   126,   -96,   -96,   122,    15,   -96,   -96,     8,   100,
-      93,    49,   119,    94,   -96,   -96,   -96,   -96,   -96,   -96,
-     -96,   -96,   -96,   -96,   -96,   -96,   -96,   102,    28,   149,
-     110,   150,   -96,   -96,    17,     8,   119,   152,   142,    22,
-     152,   -96,   134,   119,   152,   144,   -96,   158,   118,   -96,
-     -96,   -96,   160,   -96,   -96,   -96,    35,    88,   -96,   162,
-     163,   -96,   -96,   -96,   120,   114,   124,   128,    28,   -96,
-      -8,   -96,   -96,    77,   -96,    -7,   119,   158,   -96,    18,
-     165,   -96,    50,   119,   129,   -96,    54,   -96,   133,   123,
-     -96,   -96,   125,    37,     4,   -96,   -96,    88,   -27,   -96,
-      28,   137,    17,   -96,    20,   -96,   152,   -96,   -96,    66,
-     -96,   -96,   -96,   -96,   169,   158,   -96,   -96,   136,   -96,
-      28,   -96,     7,   -96,   138,   139,   -96,   -96,   -96,    68,
-     -96,   -96,   -96,   140,   -96,   114,   -96,   -96,   114,   -96,
-     -96,   -96,   -96,   -96,   -96,   -96,   141,   146,   -96,   -96
+       9,   -25,    35,    61,     2,  -118,    12,  -118,    49,  -118,
+    -118,  -118,     6,  -118,  -118,    70,   100,  -118,  -118,    54,
+      58,   112,  -118,    45,    84,    44,  -118,  -118,  -118,    32,
+      31,    90,   144,    22,   145,    92,   137,  -118,  -118,   133,
+      26,  -118,  -118,    31,    31,    31,    31,    31,    31,    31,
+      31,    31,   104,   103,   111,   139,   114,  -118,  -118,  -118,
+    -118,  -118,  -118,  -118,  -118,  -118,  -118,  -118,  -118,  -118,
+    -118,  -118,  -118,  -118,  -118,  -118,  -118,  -118,    84,   159,
+     163,   149,  -118,  -118,   117,   162,  -118,  -118,    21,    31,
+     139,   166,   154,     5,   166,  -118,   158,   139,   166,   168,
+    -118,  -118,  -118,  -118,  -118,  -118,  -118,  -118,  -118,   183,
+     134,  -118,  -118,  -118,   187,  -118,  -118,  -118,    64,  -118,
+     135,    25,   190,   138,   142,   146,    25,  -118,     1,  -118,
+    -118,    84,  -118,    41,   139,   183,  -118,    53,   191,  -118,
+      77,   139,   147,  -118,    78,  -118,   140,   141,  -118,   195,
+     197,  -118,  -118,  -118,   143,    34,   148,  -118,  -118,   150,
+     -21,  -118,    25,   151,    21,  -118,    42,  -118,   166,  -118,
+    -118,    81,  -118,  -118,  -118,  -118,   200,   183,  -118,  -118,
+    -118,  -118,   152,  -118,    25,    20,   148,  -118,   153,   156,
+    -118,  -118,  -118,    48,  -118,  -118,  -118,   157,  -118,   138,
+    -118,  -118,    23,   138,  -118,  -118,  -118,  -118,  -118,  -118,
+    -118,   161,  -118,   164,  -118,  -118
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-     -96,   -96,   -96,   -96,   -94,   -95,   -96,    33,   -96,   -12,
-     -84,   -96,   -96,   -96,   -96,   -96,   -96,   -96,   -96,   106,
-     -20,   -96,   -96,    23,    62,   -96,   -96,   -96,   -49,    69,
-     -96,    40,    41,   -96,   -96,   -96,   -96,   -96,   -96,   164,
-     -96,   -96,   -96
+    -118,  -118,  -118,  -118,  -117,  -115,  -118,    46,  -118,   -12,
+     -71,  -118,  -118,  -118,  -118,  -118,  -118,  -118,  -118,   120,
+     -28,  -118,  -118,  -118,  -118,  -118,  -118,  -118,  -118,  -118,
+    -118,    29,    79,  -118,  -118,  -118,   -54,   -76,  -118,    47,
+      39,  -118,  -118,  -118,  -118,  -118,  -118,   188,  -118,  -118,
+    -118
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -761,81 +806,88 @@ static const yytype_int16 yypgoto[] =
 #define YYTABLE_NINF -9
 static const yytype_int16 yytable[] =
 {
-      18,   132,   131,    95,     7,     8,     7,     8,     7,     8,
-     138,     7,     8,   134,   141,    24,    70,   163,    78,    13,
-      14,    70,   107,    70,   164,    85,   168,   112,    86,     1,
-      70,    76,    98,    83,   121,     4,   169,   142,   146,   129,
-     130,    16,   143,   147,    33,    29,   165,    30,     5,    31,
-       9,    71,    17,   162,   161,   111,    71,   177,    71,   118,
-     108,    32,    77,   146,    84,    71,   176,   148,   150,    99,
-     100,   117,    98,   180,   153,   183,    99,   100,    93,    94,
-     186,   159,    35,   187,    36,   160,    37,     6,    38,    39,
-     181,   182,     7,     8,    40,   146,    41,    88,    42,   155,
-     152,    43,    44,    19,   156,    45,    89,    90,    91,    99,
-     100,   155,    46,    47,    48,    20,   172,    49,     7,   130,
-      21,   119,    18,    50,    35,   122,    36,    22,    37,    23,
-      38,    39,    24,    67,    68,    69,    40,    96,    41,    74,
-      42,    80,    75,    43,    44,    79,    81,    45,    82,    87,
-      18,    97,   104,   105,    46,    47,    48,   113,    70,    49,
-     116,   120,   123,   124,   128,   127,   135,   136,   139,   137,
-     151,   140,   154,   173,    -8,   167,   158,   106,   174,   149,
-     157,   166,   144,   179,   185,   188,   171,   175,     0,   178,
-     189,     0,    34
+      18,   117,   119,   154,   158,    92,     7,     8,   160,   163,
+       7,     8,    99,    84,     1,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,     7,     8,   125,     7,     8,   157,
+      84,   187,     4,    24,    84,     5,   130,    25,   188,    84,
+      90,    13,    14,   139,    97,   189,    24,    78,   192,    79,
+      25,    80,   157,   205,   164,   166,    85,    21,   193,   165,
+       9,   129,   135,    81,    17,   136,    82,   200,   147,   148,
+     206,   207,   126,    85,   149,   150,   208,    85,   201,    91,
+     170,   212,    85,    98,   211,   185,   183,   175,   213,    30,
+     184,    31,     6,    32,   168,    33,    34,   149,   150,   169,
+      16,    35,    19,    36,    20,    37,   168,   110,    38,    39,
+      22,   172,    40,   149,   150,   202,   111,   112,   113,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+     168,   177,    52,   137,   177,   174,   178,   140,    53,   196,
+     115,   116,     7,   148,    30,    23,    31,    88,    32,    94,
+      33,    34,     7,     8,    89,    93,    35,    95,    36,    96,
+      37,   109,   120,    38,    39,   118,   121,    40,   123,   122,
+      84,   131,   134,    18,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,   138,   141,    52,   142,   145,
+      18,   146,   156,   159,   161,   179,   173,   162,   176,   180,
+      -8,   181,   182,   190,   197,   124,   198,   186,   204,   210,
+     191,   199,   203,   214,   171,   195,   215,    83
 };
 
 #define yypact_value_is_default(yystate) \
-  ((yystate) == (-96))
+  ((yystate) == (-118))
 
 #define yytable_value_is_error(yytable_value) \
   YYID (0)
 
-static const yytype_int16 yycheck[] =
+static const yytype_uint8 yycheck[] =
 {
-      12,    96,    96,    52,     4,     5,     4,     5,     4,     5,
-     105,     4,     5,    97,   108,     5,     8,    44,    38,    29,
-      30,     8,     5,     8,    51,    45,     6,    76,    48,     5,
-       8,    18,     4,    18,    83,    49,    16,    45,    45,     4,
-       5,    43,    50,    50,    34,     3,   140,     5,     0,     7,
-      50,    43,    50,   137,    50,    75,    43,    50,    43,    79,
-      43,    19,    49,    45,    49,    43,   160,   116,    50,    41,
-      42,    49,     4,     5,   123,   169,    41,    42,    29,    30,
-     175,    44,     5,   178,     7,    48,     9,    31,    11,    12,
-      22,    23,     4,     5,    17,    45,    19,     4,    21,    45,
-      50,    24,    25,    32,    50,    28,    13,    14,    15,    41,
-      42,    45,    35,    36,    37,     4,    50,    40,     4,     5,
-       3,    80,   134,    46,     5,    84,     7,    44,     9,    33,
-      11,    12,     5,     3,     3,    20,    17,    43,    19,    49,
-      21,    49,    10,    24,    25,    10,    20,    28,    26,    49,
-     162,    49,     3,    43,    35,    36,    37,     5,     8,    40,
-      18,    27,    18,     5,     4,    47,     4,     4,    44,    49,
-       5,    43,    43,     4,    51,   142,    51,    71,   155,   117,
-      47,    44,   113,    44,    44,    44,   146,    51,    -1,    51,
-      44,    -1,    28
+      12,    55,    78,   118,   121,    33,     4,     5,   123,   126,
+       4,     5,    40,     8,     5,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,     4,     5,     5,     4,     5,     4,
+       8,    52,    57,     1,     8,     0,    90,     5,    59,     8,
+      18,    29,    30,    97,    18,   162,     1,     3,     6,     5,
+       5,     7,     4,     5,    53,   131,    51,     3,    16,    58,
+      58,    89,    57,    19,    58,    93,    34,   184,     4,     5,
+      22,    23,    51,    51,    49,    50,   193,    51,    58,    57,
+     134,    58,    51,    57,   199,   156,    52,   141,   203,     5,
+      56,     7,    31,     9,    53,    11,    12,    49,    50,    58,
+      51,    17,    32,    19,     4,    21,    53,     4,    24,    25,
+      52,    58,    28,    49,    50,   186,    13,    14,    15,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      53,    53,    48,    94,    53,    58,    58,    98,    54,    58,
+      29,    30,     4,     5,     5,    33,     7,    57,     9,    57,
+      11,    12,     4,     5,    10,    10,    17,    20,    19,    26,
+      21,    57,     3,    24,    25,    51,     3,    28,    51,    20,
+       8,     5,    18,   185,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    27,    18,    48,     5,    55,
+     202,     4,    57,     3,    52,    55,     5,    51,    51,     4,
+      59,     4,    59,    52,     4,    85,   177,    57,    52,    52,
+     164,    59,    59,    52,   135,   168,    52,    29
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,     5,    53,    93,    49,     0,    31,     4,     5,    50,
-      57,    61,    62,    29,    30,    94,    43,    50,    61,    32,
-       4,     3,    44,    33,     5,    89,    90,    91,    92,     3,
-       5,     7,    19,    34,    91,     5,     7,     9,    11,    12,
-      17,    19,    21,    24,    25,    28,    35,    36,    37,    40,
-      46,    64,    65,    68,    69,    70,    73,    74,    77,    78,
-      79,    80,    81,    85,    86,    87,    88,     3,     3,    20,
-       8,    43,    71,    72,    49,    10,    18,    49,    72,    10,
-      49,    20,    26,    18,    49,    72,    72,    49,     4,    13,
-      14,    15,    63,    29,    30,    80,    43,    49,     4,    41,
-      42,    54,    55,    56,     3,    43,    71,     5,    43,    59,
-      60,    72,    80,     5,    83,    84,    18,    49,    72,    84,
-      27,    80,    84,    18,     5,    75,    76,    47,     4,     4,
-       5,    56,    57,    67,    62,     4,     4,    49,    57,    44,
-      43,    56,    45,    50,    81,    82,    45,    50,    80,    76,
-      50,     5,    50,    80,    43,    45,    50,    47,    51,    44,
-      48,    50,    62,    44,    51,    56,    44,    59,     6,    16,
-      66,    83,    50,     4,    75,    51,    56,    50,    51,    44,
-       5,    22,    23,    56,    58,    44,    57,    57,    44,    44
+       0,     5,    61,   109,    57,     0,    31,     4,     5,    58,
+      65,    69,    70,    29,    30,   110,    51,    58,    69,    32,
+       4,     3,    52,    33,     1,     5,   105,   106,   107,   108,
+       5,     7,     9,    11,    12,    17,    19,    21,    24,    25,
+      28,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    48,    54,    72,    73,    76,    77,    78,    81,
+      82,    83,    84,    85,    86,    87,    88,    89,    90,    93,
+      94,    95,    96,    97,   101,   102,   103,   104,     3,     5,
+       7,    19,    34,   107,     8,    51,    79,    80,    57,    10,
+      18,    57,    80,    10,    57,    20,    26,    18,    57,    80,
+      80,    80,    80,    80,    80,    80,    80,    80,    80,    57,
+       4,    13,    14,    15,    71,    29,    30,    96,    51,    97,
+       3,     3,    20,    51,    79,     5,    51,    67,    68,    80,
+      96,     5,    99,   100,    18,    57,    80,   100,    27,    96,
+     100,    18,     5,    91,    92,    55,     4,     4,     5,    49,
+      50,    62,    63,    64,    65,    75,    57,     4,    64,     3,
+      65,    52,    51,    64,    53,    58,    97,    98,    53,    58,
+      96,    92,    58,     5,    58,    96,    51,    53,    58,    55,
+       4,     4,    59,    52,    56,    70,    57,    52,    59,    64,
+      52,    67,     6,    16,    74,    99,    58,     4,    91,    59,
+      64,    58,    70,    59,    52,     5,    22,    23,    64,    66,
+      52,    65,    58,    65,    52,    52
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -1672,8 +1724,8 @@ yyreduce:
         case 2:
 
 /* Line 1806 of yacc.c  */
-#line 121 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_DEFINITIONS|(yyvsp[(3) - 
(8)].constant));
+#line 136 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_DEFINITIONS|(yyvsp[(3) - 
(8)].constant));
                     _asn1_set_name((yyval.node),_asn1_get_name((yyvsp[(1) - 
(8)].node)));
                     _asn1_set_name((yyvsp[(1) - (8)].node),"");
                     _asn1_set_right((yyvsp[(1) - (8)].node),(yyvsp[(7) - 
(8)].node));
@@ -1686,21 +1738,21 @@ yyreduce:
   case 3:
 
 /* Line 1806 of yacc.c  */
-#line 131 "ASN1.y"
+#line 146 "ASN1.y"
     {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
     break;
 
   case 4:
 
 /* Line 1806 of yacc.c  */
-#line 132 "ASN1.y"
+#line 147 "ASN1.y"
     {strcpy((yyval.str),(yyvsp[(2) - (2)].str));}
     break;
 
   case 5:
 
 /* Line 1806 of yacc.c  */
-#line 135 "ASN1.y"
+#line 150 "ASN1.y"
     {strcpy((yyval.str),"-");
                        strcat((yyval.str),(yyvsp[(2) - (2)].str));}
     break;
@@ -1708,58 +1760,58 @@ yyreduce:
   case 6:
 
 /* Line 1806 of yacc.c  */
-#line 139 "ASN1.y"
+#line 154 "ASN1.y"
     {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
     break;
 
   case 7:
 
 /* Line 1806 of yacc.c  */
-#line 140 "ASN1.y"
+#line 155 "ASN1.y"
     {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
     break;
 
   case 8:
 
 /* Line 1806 of yacc.c  */
-#line 143 "ASN1.y"
+#line 158 "ASN1.y"
     {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
     break;
 
   case 9:
 
 /* Line 1806 of yacc.c  */
-#line 144 "ASN1.y"
+#line 159 "ASN1.y"
     {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
     break;
 
   case 10:
 
 /* Line 1806 of yacc.c  */
-#line 147 "ASN1.y"
+#line 162 "ASN1.y"
     {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
     break;
 
   case 11:
 
 /* Line 1806 of yacc.c  */
-#line 148 "ASN1.y"
+#line 163 "ASN1.y"
     {strcpy((yyval.str),(yyvsp[(1) - (1)].str));}
     break;
 
   case 12:
 
 /* Line 1806 of yacc.c  */
-#line 151 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_CONSTANT);
+#line 166 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
                                        _asn1_set_value((yyval.node),(yyvsp[(2) 
- (3)].str),strlen((yyvsp[(2) - (3)].str))+1);}
     break;
 
   case 13:
 
 /* Line 1806 of yacc.c  */
-#line 153 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_CONSTANT);
+#line 168 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
                                       _asn1_set_name((yyval.node),(yyvsp[(1) - 
(4)].str));
                                        _asn1_set_value((yyval.node),(yyvsp[(3) 
- (4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
     break;
@@ -1767,14 +1819,14 @@ yyreduce:
   case 14:
 
 /* Line 1806 of yacc.c  */
-#line 158 "ASN1.y"
+#line 173 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
   case 15:
 
 /* Line 1806 of yacc.c  */
-#line 159 "ASN1.y"
+#line 174 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (3)].node);
                                             
_asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (3)].node)),(yyvsp[(3) - 
(3)].node));}
     break;
@@ -1782,16 +1834,16 @@ yyreduce:
   case 16:
 
 /* Line 1806 of yacc.c  */
-#line 163 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_CONSTANT);
+#line 178 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
                                    _asn1_set_value((yyval.node),(yyvsp[(1) - 
(1)].str),strlen((yyvsp[(1) - (1)].str))+1);}
     break;
 
   case 17:
 
 /* Line 1806 of yacc.c  */
-#line 165 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_CONSTANT);
+#line 180 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
                                    _asn1_set_name((yyval.node),(yyvsp[(1) - 
(4)].str));
                                     _asn1_set_value((yyval.node),(yyvsp[(3) - 
(4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
     break;
@@ -1799,14 +1851,14 @@ yyreduce:
   case 18:
 
 /* Line 1806 of yacc.c  */
-#line 170 "ASN1.y"
+#line 185 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
   case 19:
 
 /* Line 1806 of yacc.c  */
-#line 171 "ASN1.y"
+#line 186 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (2)].node);
                                                     
_asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (2)].node)),(yyvsp[(2) - 
(2)].node));}
     break;
@@ -1814,111 +1866,111 @@ yyreduce:
   case 20:
 
 /* Line 1806 of yacc.c  */
-#line 175 "ASN1.y"
+#line 190 "ASN1.y"
     {(yyval.constant)=CONST_UNIVERSAL;}
     break;
 
   case 21:
 
 /* Line 1806 of yacc.c  */
-#line 176 "ASN1.y"
+#line 191 "ASN1.y"
     {(yyval.constant)=CONST_PRIVATE;}
     break;
 
   case 22:
 
 /* Line 1806 of yacc.c  */
-#line 177 "ASN1.y"
+#line 192 "ASN1.y"
     {(yyval.constant)=CONST_APPLICATION;}
     break;
 
   case 23:
 
 /* Line 1806 of yacc.c  */
-#line 180 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_TAG);
+#line 195 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_TAG);
                             _asn1_set_value((yyval.node),(yyvsp[(2) - 
(3)].str),strlen((yyvsp[(2) - (3)].str))+1);}
     break;
 
   case 24:
 
 /* Line 1806 of yacc.c  */
-#line 182 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_TAG | (yyvsp[(2) - 
(4)].constant));
+#line 197 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_TAG | (yyvsp[(2) - 
(4)].constant));
                                 _asn1_set_value((yyval.node),(yyvsp[(3) - 
(4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
     break;
 
   case 25:
 
 /* Line 1806 of yacc.c  */
-#line 186 "ASN1.y"
+#line 201 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
   case 26:
 
 /* Line 1806 of yacc.c  */
-#line 187 "ASN1.y"
+#line 202 "ASN1.y"
     {(yyval.node)=_asn1_mod_type((yyvsp[(1) - (2)].node),CONST_EXPLICIT);}
     break;
 
   case 27:
 
 /* Line 1806 of yacc.c  */
-#line 188 "ASN1.y"
+#line 203 "ASN1.y"
     {(yyval.node)=_asn1_mod_type((yyvsp[(1) - (2)].node),CONST_IMPLICIT);}
     break;
 
   case 28:
 
 /* Line 1806 of yacc.c  */
-#line 191 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_DEFAULT);
+#line 206 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_DEFAULT);
                                        _asn1_set_value((yyval.node),(yyvsp[(2) 
- (2)].str),strlen((yyvsp[(2) - (2)].str))+1);}
     break;
 
   case 29:
 
 /* Line 1806 of yacc.c  */
-#line 193 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_DEFAULT|CONST_TRUE);}
+#line 208 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_DEFAULT|CONST_TRUE);}
     break;
 
   case 30:
 
 /* Line 1806 of yacc.c  */
-#line 194 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_DEFAULT|CONST_FALSE);}
+#line 209 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_DEFAULT|CONST_FALSE);}
     break;
 
   case 33:
 
 /* Line 1806 of yacc.c  */
-#line 203 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_INTEGER);}
+#line 218 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_INTEGER);}
     break;
 
   case 34:
 
 /* Line 1806 of yacc.c  */
-#line 204 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_INTEGER|CONST_LIST);
+#line 219 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_INTEGER|CONST_LIST);
                                         _asn1_set_down((yyval.node),(yyvsp[(3) 
- (4)].node));}
     break;
 
   case 35:
 
 /* Line 1806 of yacc.c  */
-#line 206 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_INTEGER);}
+#line 221 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_INTEGER);}
     break;
 
   case 36:
 
 /* Line 1806 of yacc.c  */
-#line 208 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_INTEGER|CONST_MIN_MAX);
-                                         
_asn1_set_down((yyval.node),_asn1_add_static_node(TYPE_SIZE));
+#line 223 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_INTEGER|CONST_MIN_MAX);
+                                         
_asn1_set_down((yyval.node),_asn1_add_static_node(ASN1_ETYPE_SIZE));
                                          
_asn1_set_value(_asn1_get_down((yyval.node)),(yyvsp[(6) - 
(7)].str),strlen((yyvsp[(6) - (7)].str))+1);
                                          
_asn1_set_name(_asn1_get_down((yyval.node)),(yyvsp[(3) - (7)].str));}
     break;
@@ -1926,37 +1978,37 @@ yyreduce:
   case 37:
 
 /* Line 1806 of yacc.c  */
-#line 214 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_BOOLEAN);}
+#line 229 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_BOOLEAN);}
     break;
 
   case 38:
 
 /* Line 1806 of yacc.c  */
-#line 217 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_TIME|CONST_UTC);}
+#line 232 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_TIME|CONST_UTC);}
     break;
 
   case 39:
 
 /* Line 1806 of yacc.c  */
-#line 218 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_TIME|CONST_GENERALIZED);}
+#line 233 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_TIME|CONST_GENERALIZED);}
     break;
 
   case 40:
 
 /* Line 1806 of yacc.c  */
-#line 221 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_SIZE|CONST_1_PARAM);
+#line 236 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_SIZE|CONST_1_PARAM);
                                      _asn1_set_value((yyval.node),(yyvsp[(3) - 
(4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
     break;
 
   case 41:
 
 /* Line 1806 of yacc.c  */
-#line 224 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_SIZE|CONST_MIN_MAX);
+#line 239 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_SIZE|CONST_MIN_MAX);
                                      _asn1_set_value((yyval.node),(yyvsp[(3) - 
(7)].str),strlen((yyvsp[(3) - (7)].str))+1);
                                       _asn1_set_name((yyval.node),(yyvsp[(6) - 
(7)].str));}
     break;
@@ -1964,451 +2016,634 @@ yyreduce:
   case 42:
 
 /* Line 1806 of yacc.c  */
-#line 229 "ASN1.y"
+#line 244 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
   case 43:
 
 /* Line 1806 of yacc.c  */
-#line 230 "ASN1.y"
+#line 245 "ASN1.y"
     {(yyval.node)=(yyvsp[(2) - (3)].node);}
     break;
 
   case 44:
 
 /* Line 1806 of yacc.c  */
-#line 233 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_GENERALSTRING);}
+#line 248 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_GENERALSTRING);}
     break;
 
   case 45:
 
 /* Line 1806 of yacc.c  */
-#line 234 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_GENERALSTRING|CONST_SIZE);
+#line 249 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_GENERALSTRING|CONST_SIZE);
                                          
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
   case 46:
 
 /* Line 1806 of yacc.c  */
-#line 238 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_OCTET_STRING);}
+#line 253 "ASN1.y"
+    
{(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_NUMERICSTRING|CONST_UNIVERSAL);}
     break;
 
   case 47:
 
 /* Line 1806 of yacc.c  */
-#line 239 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_OCTET_STRING|CONST_SIZE);
-                                           
_asn1_set_down((yyval.node),(yyvsp[(3) - (3)].node));}
+#line 254 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_NUMERICSTRING|CONST_SIZE);
+                                         
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
   case 48:
 
 /* Line 1806 of yacc.c  */
-#line 243 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_CONSTANT);
-                                  _asn1_set_name((yyval.node),(yyvsp[(1) - 
(4)].str));
-                                    _asn1_set_value((yyval.node),(yyvsp[(3) - 
(4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
+#line 258 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_IA5STRING);}
     break;
 
   case 49:
 
 /* Line 1806 of yacc.c  */
-#line 248 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 259 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_IA5STRING|CONST_SIZE);
+                                         
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
   case 50:
 
 /* Line 1806 of yacc.c  */
-#line 249 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (3)].node);
-                                                       
_asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (3)].node)),(yyvsp[(3) - 
(3)].node));}
+#line 263 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_TELETEXSTRING);}
     break;
 
   case 51:
 
 /* Line 1806 of yacc.c  */
-#line 253 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_BIT_STRING);}
+#line 264 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_TELETEXSTRING|CONST_SIZE);
+                                         
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
   case 52:
 
 /* Line 1806 of yacc.c  */
-#line 254 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_BIT_STRING|CONST_SIZE);}
+#line 268 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_PRINTABLESTRING);}
     break;
 
   case 53:
 
 /* Line 1806 of yacc.c  */
-#line 256 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_BIT_STRING|CONST_LIST);
-                                _asn1_set_down((yyval.node),(yyvsp[(4) - 
(5)].node));}
+#line 269 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_PRINTABLESTRING|CONST_SIZE);
+                                         
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
   case 54:
 
 /* Line 1806 of yacc.c  */
-#line 261 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_ENUMERATED|CONST_LIST);
-                                _asn1_set_down((yyval.node),(yyvsp[(3) - 
(4)].node));}
+#line 273 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_UNIVERSALSTRING);}
     break;
 
   case 55:
 
 /* Line 1806 of yacc.c  */
-#line 266 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_OBJECT_ID);}
+#line 274 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_UNIVERSALSTRING|CONST_SIZE);
+                                         
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
   case 56:
 
 /* Line 1806 of yacc.c  */
-#line 269 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_IDENTIFIER);
-                                       _asn1_set_value((yyval.node),(yyvsp[(1) 
- (1)].str),strlen((yyvsp[(1) - (1)].str))+1);}
+#line 278 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_BMPSTRING);}
     break;
 
   case 57:
 
 /* Line 1806 of yacc.c  */
-#line 271 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_IDENTIFIER|CONST_SIZE);
-                                       _asn1_set_value((yyval.node),(yyvsp[(1) 
- (2)].str),strlen((yyvsp[(1) - (2)].str))+1);
-                                       _asn1_set_down((yyval.node),(yyvsp[(2) 
- (2)].node));}
+#line 279 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_BMPSTRING|CONST_SIZE);
+                                         
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
   case 58:
 
 /* Line 1806 of yacc.c  */
-#line 274 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 283 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_UTF8STRING);}
     break;
 
   case 59:
 
 /* Line 1806 of yacc.c  */
-#line 275 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 284 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_UTF8STRING|CONST_SIZE);
+                                         
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
   case 60:
 
 /* Line 1806 of yacc.c  */
-#line 276 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 288 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_VISIBLESTRING);}
+    break;
+
+  case 61:
+
+/* Line 1806 of yacc.c  */
+#line 289 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_VISIBLESTRING|CONST_SIZE);
+                                         
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
   case 62:
 
 /* Line 1806 of yacc.c  */
-#line 278 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 293 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_OCTET_STRING);}
     break;
 
   case 63:
 
 /* Line 1806 of yacc.c  */
-#line 279 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 294 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_OCTET_STRING|CONST_SIZE);
+                                           
_asn1_set_down((yyval.node),(yyvsp[(3) - (3)].node));}
     break;
 
   case 64:
 
 /* Line 1806 of yacc.c  */
-#line 280 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 298 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
+                                  _asn1_set_name((yyval.node),(yyvsp[(1) - 
(4)].str));
+                                    _asn1_set_value((yyval.node),(yyvsp[(3) - 
(4)].str),strlen((yyvsp[(3) - (4)].str))+1);}
     break;
 
   case 65:
 
 /* Line 1806 of yacc.c  */
-#line 281 "ASN1.y"
+#line 303 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
   case 66:
 
 /* Line 1806 of yacc.c  */
-#line 282 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 304 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (3)].node);
+                                                       
_asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (3)].node)),(yyvsp[(3) - 
(3)].node));}
     break;
 
   case 67:
 
 /* Line 1806 of yacc.c  */
-#line 283 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 308 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_BIT_STRING);}
     break;
 
   case 68:
 
 /* Line 1806 of yacc.c  */
-#line 284 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 309 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_BIT_STRING|CONST_SIZE);}
     break;
 
   case 69:
 
 /* Line 1806 of yacc.c  */
-#line 285 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 311 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_BIT_STRING|CONST_LIST);
+                                _asn1_set_down((yyval.node),(yyvsp[(4) - 
(5)].node));}
     break;
 
   case 70:
 
 /* Line 1806 of yacc.c  */
-#line 286 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_NULL);}
+#line 316 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_ENUMERATED|CONST_LIST);
+                                _asn1_set_down((yyval.node),(yyvsp[(3) - 
(4)].node));}
     break;
 
   case 71:
 
 /* Line 1806 of yacc.c  */
-#line 289 "ASN1.y"
-    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+#line 321 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID);}
     break;
 
   case 72:
 
 /* Line 1806 of yacc.c  */
-#line 290 "ASN1.y"
+#line 324 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_IDENTIFIER);
+                                       _asn1_set_value((yyval.node),(yyvsp[(1) 
- (1)].str),strlen((yyvsp[(1) - (1)].str))+1);}
+    break;
+
+  case 73:
+
+/* Line 1806 of yacc.c  */
+#line 326 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_IDENTIFIER|CONST_SIZE);
+                                       _asn1_set_value((yyval.node),(yyvsp[(1) 
- (2)].str),strlen((yyvsp[(1) - (2)].str))+1);
+                                       _asn1_set_down((yyval.node),(yyvsp[(2) 
- (2)].node));}
+    break;
+
+  case 74:
+
+/* Line 1806 of yacc.c  */
+#line 329 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 75:
+
+/* Line 1806 of yacc.c  */
+#line 330 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 76:
+
+/* Line 1806 of yacc.c  */
+#line 331 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 78:
+
+/* Line 1806 of yacc.c  */
+#line 333 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 79:
+
+/* Line 1806 of yacc.c  */
+#line 334 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 80:
+
+/* Line 1806 of yacc.c  */
+#line 335 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 81:
+
+/* Line 1806 of yacc.c  */
+#line 336 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 82:
+
+/* Line 1806 of yacc.c  */
+#line 337 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 83:
+
+/* Line 1806 of yacc.c  */
+#line 338 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 84:
+
+/* Line 1806 of yacc.c  */
+#line 339 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 85:
+
+/* Line 1806 of yacc.c  */
+#line 340 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 86:
+
+/* Line 1806 of yacc.c  */
+#line 341 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 87:
+
+/* Line 1806 of yacc.c  */
+#line 342 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 88:
+
+/* Line 1806 of yacc.c  */
+#line 343 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 89:
+
+/* Line 1806 of yacc.c  */
+#line 344 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 90:
+
+/* Line 1806 of yacc.c  */
+#line 345 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 91:
+
+/* Line 1806 of yacc.c  */
+#line 346 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 92:
+
+/* Line 1806 of yacc.c  */
+#line 347 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 93:
+
+/* Line 1806 of yacc.c  */
+#line 348 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 94:
+
+/* Line 1806 of yacc.c  */
+#line 349 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_NULL);}
+    break;
+
+  case 95:
+
+/* Line 1806 of yacc.c  */
+#line 352 "ASN1.y"
+    {(yyval.node)=(yyvsp[(1) - (1)].node);}
+    break;
+
+  case 96:
+
+/* Line 1806 of yacc.c  */
+#line 353 "ASN1.y"
     {(yyval.node)=_asn1_mod_type((yyvsp[(2) - (2)].node),CONST_TAG);
                                                _asn1_set_right((yyvsp[(1) - 
(2)].node),_asn1_get_down((yyval.node)));
                                                
_asn1_set_down((yyval.node),(yyvsp[(1) - (2)].node));}
     break;
 
-  case 73:
+  case 97:
 
 /* Line 1806 of yacc.c  */
-#line 295 "ASN1.y"
+#line 358 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
-  case 74:
+  case 98:
 
 /* Line 1806 of yacc.c  */
-#line 296 "ASN1.y"
+#line 359 "ASN1.y"
     {(yyval.node)=_asn1_mod_type((yyvsp[(1) - (2)].node),CONST_DEFAULT);
                                                        
_asn1_set_right((yyvsp[(2) - (2)].node),_asn1_get_down((yyval.node)));
                                                       
_asn1_set_down((yyval.node),(yyvsp[(2) - (2)].node));}
     break;
 
-  case 75:
+  case 99:
 
 /* Line 1806 of yacc.c  */
-#line 299 "ASN1.y"
+#line 362 "ASN1.y"
     {(yyval.node)=_asn1_mod_type((yyvsp[(1) - (2)].node),CONST_OPTION);}
     break;
 
-  case 76:
+  case 100:
 
 /* Line 1806 of yacc.c  */
-#line 302 "ASN1.y"
+#line 365 "ASN1.y"
     {(yyval.node)=_asn1_set_name((yyvsp[(2) - (2)].node),(yyvsp[(1) - 
(2)].str));}
     break;
 
-  case 77:
+  case 101:
 
 /* Line 1806 of yacc.c  */
-#line 305 "ASN1.y"
+#line 368 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
-  case 78:
+  case 102:
 
 /* Line 1806 of yacc.c  */
-#line 306 "ASN1.y"
+#line 369 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (3)].node);
                                                 
_asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (3)].node)),(yyvsp[(3) - 
(3)].node));}
     break;
 
-  case 79:
+  case 103:
 
 /* Line 1806 of yacc.c  */
-#line 310 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_SEQUENCE);
+#line 373 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_SEQUENCE);
                                               
_asn1_set_down((yyval.node),(yyvsp[(3) - (4)].node));}
     break;
 
-  case 80:
+  case 104:
 
 /* Line 1806 of yacc.c  */
-#line 312 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_SEQUENCE_OF);
+#line 375 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_SEQUENCE_OF);
                                               
_asn1_set_down((yyval.node),(yyvsp[(3) - (3)].node));}
     break;
 
-  case 81:
+  case 105:
 
 /* Line 1806 of yacc.c  */
-#line 314 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_SEQUENCE_OF|CONST_SIZE);
+#line 377 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_SEQUENCE_OF|CONST_SIZE);
                                             _asn1_set_right((yyvsp[(2) - 
(4)].node),(yyvsp[(4) - (4)].node));
                                             
_asn1_set_down((yyval.node),(yyvsp[(2) - (4)].node));}
     break;
 
-  case 82:
+  case 106:
 
 /* Line 1806 of yacc.c  */
-#line 319 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_SET);
+#line 382 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_SET);
                                      _asn1_set_down((yyval.node),(yyvsp[(3) - 
(4)].node));}
     break;
 
-  case 83:
+  case 107:
 
 /* Line 1806 of yacc.c  */
-#line 321 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_SET_OF);
+#line 384 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_SET_OF);
                                      _asn1_set_down((yyval.node),(yyvsp[(3) - 
(3)].node));}
     break;
 
-  case 84:
+  case 108:
 
 /* Line 1806 of yacc.c  */
-#line 323 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_SET_OF|CONST_SIZE);
+#line 386 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_SET_OF|CONST_SIZE);
                                        _asn1_set_right((yyvsp[(2) - 
(4)].node),(yyvsp[(4) - (4)].node));
                                        _asn1_set_down((yyval.node),(yyvsp[(2) 
- (4)].node));}
     break;
 
-  case 85:
+  case 109:
 
 /* Line 1806 of yacc.c  */
-#line 328 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_CHOICE);
+#line 391 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_CHOICE);
                                              
_asn1_set_down((yyval.node),(yyvsp[(3) - (4)].node));}
     break;
 
-  case 86:
+  case 110:
 
 /* Line 1806 of yacc.c  */
-#line 332 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_ANY);}
+#line 395 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_ANY);}
     break;
 
-  case 87:
+  case 111:
 
 /* Line 1806 of yacc.c  */
-#line 333 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_ANY|CONST_DEFINED_BY);
-                                        
_asn1_set_down((yyval.node),_asn1_add_static_node(TYPE_CONSTANT));
+#line 396 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_ANY|CONST_DEFINED_BY);
+                                        
_asn1_set_down((yyval.node),_asn1_add_static_node(ASN1_ETYPE_CONSTANT));
                                        
_asn1_set_name(_asn1_get_down((yyval.node)),(yyvsp[(4) - (4)].str));}
     break;
 
-  case 88:
+  case 112:
 
 /* Line 1806 of yacc.c  */
-#line 338 "ASN1.y"
+#line 401 "ASN1.y"
     {(yyval.node)=_asn1_set_name((yyvsp[(3) - (3)].node),(yyvsp[(1) - 
(3)].str));}
     break;
 
-  case 89:
+  case 113:
 
 /* Line 1806 of yacc.c  */
-#line 342 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_OBJECT_ID|CONST_ASSIGN);
+#line 403 "ASN1.y"
+    {(yyval.node)=_asn1_set_name((yyvsp[(2) - (2)].node), "");}
+    break;
+
+  case 114:
+
+/* Line 1806 of yacc.c  */
+#line 407 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID|CONST_ASSIGN);
                          _asn1_set_name((yyval.node),(yyvsp[(1) - (7)].str));
                          _asn1_set_down((yyval.node),(yyvsp[(6) - (7)].node));}
     break;
 
-  case 90:
+  case 115:
 
 /* Line 1806 of yacc.c  */
-#line 346 "ASN1.y"
-    
{(yyval.node)=_asn1_add_static_node(TYPE_OBJECT_ID|CONST_ASSIGN|CONST_1_PARAM);
+#line 411 "ASN1.y"
+    
{(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID|CONST_ASSIGN|CONST_1_PARAM);
                          _asn1_set_name((yyval.node),(yyvsp[(1) - (6)].str));
                          _asn1_set_value((yyval.node),(yyvsp[(2) - 
(6)].str),strlen((yyvsp[(2) - (6)].str))+1);
                          _asn1_set_down((yyval.node),(yyvsp[(5) - (6)].node));}
     break;
 
-  case 91:
+  case 116:
 
 /* Line 1806 of yacc.c  */
-#line 351 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_INTEGER|CONST_ASSIGN);
+#line 416 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_INTEGER|CONST_ASSIGN);
                          _asn1_set_name((yyval.node),(yyvsp[(1) - (4)].str));
                          _asn1_set_value((yyval.node),(yyvsp[(4) - 
(4)].str),strlen((yyvsp[(4) - (4)].str))+1);}
     break;
 
-  case 92:
+  case 117:
 
 /* Line 1806 of yacc.c  */
-#line 356 "ASN1.y"
+#line 421 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
-  case 93:
+  case 118:
 
 /* Line 1806 of yacc.c  */
-#line 357 "ASN1.y"
+#line 422 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
-  case 94:
+  case 119:
 
 /* Line 1806 of yacc.c  */
-#line 360 "ASN1.y"
+#line 425 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (1)].node);}
     break;
 
-  case 95:
+  case 120:
 
 /* Line 1806 of yacc.c  */
-#line 361 "ASN1.y"
+#line 426 "ASN1.y"
     {(yyval.node)=(yyvsp[(1) - (2)].node);
                                                           
_asn1_set_right(_asn1_get_last_right((yyvsp[(1) - (2)].node)),(yyvsp[(2) - 
(2)].node));}
     break;
 
-  case 96:
+  case 121:
 
 /* Line 1806 of yacc.c  */
-#line 365 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_OBJECT_ID);
+#line 430 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID);
                                                           
_asn1_set_down((yyval.node),(yyvsp[(3) - (4)].node));
                                                           
_asn1_set_name((yyval.node),(yyvsp[(1) - (4)].str));}
     break;
 
-  case 97:
+  case 122:
 
 /* Line 1806 of yacc.c  */
-#line 368 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_OBJECT_ID);
+#line 433 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID);
                                                           
_asn1_set_name((yyval.node),(yyvsp[(1) - (3)].str));}
     break;
 
-  case 98:
+  case 123:
 
 /* Line 1806 of yacc.c  */
-#line 370 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(TYPE_OBJECT_ID);
+#line 435 "ASN1.y"
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID);
                                                           
_asn1_set_name((yyval.node),(yyvsp[(1) - (1)].str));}
     break;
 
-  case 99:
+  case 124:
 
 /* Line 1806 of yacc.c  */
-#line 394 "ASN1.y"
+#line 459 "ASN1.y"
     {(yyval.constant)=CONST_EXPLICIT;}
     break;
 
-  case 100:
+  case 125:
 
 /* Line 1806 of yacc.c  */
-#line 395 "ASN1.y"
+#line 460 "ASN1.y"
     {(yyval.constant)=CONST_IMPLICIT;}
     break;
 
 
 
 /* Line 1806 of yacc.c  */
-#line 2412 "ASN1.c"
+#line 2647 "ASN1.c"
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -2639,27 +2874,31 @@ yyreturn:
 
 
 /* Line 2067 of yacc.c  */
-#line 399 "ASN1.y"
+#line 464 "ASN1.y"
 
 
 
 
 static const char *key_word[] = {
-  "::=","OPTIONAL","INTEGER","SIZE","OCTET","STRING"
-  ,"SEQUENCE","BIT","UNIVERSAL","PRIVATE","OPTIONAL"
-  ,"DEFAULT","CHOICE","OF","OBJECT","IDENTIFIER"
-  ,"BOOLEAN","TRUE","FALSE","APPLICATION","ANY","DEFINED"
-  ,"SET","BY","EXPLICIT","IMPLICIT","DEFINITIONS","TAGS"
-  ,"BEGIN","END","UTCTime","GeneralizedTime"
-  ,"GeneralString","FROM","IMPORTS","NULL","ENUMERATED"};
+  "::=","OPTIONAL","INTEGER","SIZE","OCTET","STRING",
+  "SEQUENCE","BIT","UNIVERSAL","PRIVATE","OPTIONAL",
+  "DEFAULT","CHOICE","OF","OBJECT","IDENTIFIER",
+  "BOOLEAN","TRUE","FALSE","APPLICATION","ANY","DEFINED",
+  "SET","BY","EXPLICIT","IMPLICIT","DEFINITIONS","TAGS",
+  "BEGIN","END","UTCTime","GeneralizedTime",
+  "GeneralString","FROM","IMPORTS","NULL","ENUMERATED",
+  "NumericString", "IA5String", "TeletexString", "PrintableString",
+  "UniversalString", "BMPString", "UTF8String", "VisibleString"};
+
 static const int key_word_token[] = {
-  ASSIG,OPTIONAL,INTEGER,SIZE,OCTET,STRING
-  ,SEQUENCE,BIT,UNIVERSAL,PRIVATE,OPTIONAL
-  ,DEFAULT,CHOICE,OF,OBJECT,STR_IDENTIFIER
-  ,BOOLEAN,ASN1_TRUE,ASN1_FALSE,APPLICATION,ANY,DEFINED
-  ,SET,BY,EXPLICIT,IMPLICIT,DEFINITIONS,TAGS
-  ,BEGIN,END,UTCTime,GeneralizedTime
-  ,GeneralString,FROM,IMPORTS,TOKEN_NULL,ENUMERATED};
+  ASSIG, OPTIONAL, INTEGER, SIZE, OCTET, STRING, SEQUENCE, BIT, UNIVERSAL,
+      PRIVATE, OPTIONAL, DEFAULT, CHOICE, OF, OBJECT, STR_IDENTIFIER,
+      BOOLEAN, ASN1_TRUE, ASN1_FALSE, APPLICATION, ANY, DEFINED, SET, BY,
+      EXPLICIT, IMPLICIT, DEFINITIONS, TAGS, BEGIN, END, UTCTime,
+      GeneralizedTime, GeneralString, FROM, IMPORTS, TOKEN_NULL,
+      ENUMERATED, NumericString, IA5String, TeletexString, PrintableString,
+      UniversalString, BMPString, UTF8String, VisibleString
+};
 
 /*************************************************************/
 /*  Function: _asn1_yylex                                    */
@@ -2668,83 +2907,98 @@ static const int key_word_token[] = {
 /*    Token identifier or ASCII code or 0(zero: End Of File) */
 /*************************************************************/
 static int
-_asn1_yylex()
+_asn1_yylex ()
 {
-  int c,counter=0,k,lastc;
-  char string[ASN1_MAX_NAME_SIZE+1]; /* will contain the next token */
+  int c, counter = 0, k, lastc;
+  char string[ASN1_MAX_NAME_SIZE + 1];  /* will contain the next token */
   size_t i;
 
-  while(1)
+  while (1)
     {
-    while((c=fgetc(file_asn1))==' ' || c=='\t' || c=='\n')
-      if(c=='\n') lineNumber++;
+      while ((c = fgetc (file_asn1)) == ' ' || c == '\t' || c == '\n')
+        if (c == '\n')
+          line_number++;
 
-    if(c==EOF){
-      strcpy(lastToken,"End Of File");
-      return 0;
-    }
+      if (c == EOF)
+        {
+          strcpy (last_token, "End Of File");
+          return 0;
+        }
 
-    if(c=='(' || c==')' || c=='[' || c==']' ||
-       c=='{' || c=='}' || c==',' || c=='.' ||
-       c=='+' || c=='|'){
-      lastToken[0]=c;lastToken[1]=0;
-      return c;
-    }
-    if(c=='-'){  /* Maybe the first '-' of a comment */
-      if((c=fgetc(file_asn1))!='-'){
-       ungetc(c,file_asn1);
-       lastToken[0]='-';lastToken[1]=0;
-       return '-';
-      }
-      else{ /* Comments */
-       lastc=0;
-       counter=0;
-       /* A comment finishes at the next double hypen or the end of line */
-       while((c=fgetc(file_asn1))!=EOF && c!='\n' &&
-             (lastc!='-' || (lastc=='-' && c!='-')))
-         lastc=c;
-       if(c==EOF){
-         strcpy(lastToken,"End Of File");
-         return 0;
-       }
-       else{
-         if(c=='\n') lineNumber++;
-         continue; /* next char, please! (repeat the search) */
-       }
-      }
-    }
-    string[counter++]=c;
-    /* Till the end of the token */
-    while(!((c=fgetc(file_asn1))==EOF || c==' '|| c=='\t' || c=='\n' ||
-            c=='(' || c==')' || c=='[' || c==']' ||
-            c=='{' || c=='}' || c==',' || c=='.'))
-      {
-       if(counter>=ASN1_MAX_NAME_SIZE){
-         result_parse=ASN1_NAME_TOO_LONG;
-         return 0;
-       }
-       string[counter++]=c;
-      }
-    ungetc(c,file_asn1);
-    string[counter]=0;
-    strcpy(lastToken,string);
-
-    /* Is STRING a number? */
-    for(k=0;k<counter;k++)
-      if(!isdigit(string[k])) break;
-    if(k>=counter)
-      {
-      strcpy(yylval.str,string);
-      return NUM; /* return the number */
-      }
+      if (c == '(' || c == ')' || c == '[' || c == ']' ||
+          c == '{' || c == '}' || c == ',' || c == '.' ||
+          c == '+' || c == '|')
+        {
+          last_token[0] = c;
+          last_token[1] = 0;
+          return c;
+        }
+      if (c == '-')
+        {                       /* Maybe the first '-' of a comment */
+          if ((c = fgetc (file_asn1)) != '-')
+            {
+              ungetc (c, file_asn1);
+              last_token[0] = '-';
+              last_token[1] = 0;
+              return '-';
+            }
+          else
+            {                   /* Comments */
+              lastc = 0;
+              counter = 0;
+              /* A comment finishes at the next double hypen or the end of 
line */
+              while ((c = fgetc (file_asn1)) != EOF && c != '\n' &&
+                     (lastc != '-' || (lastc == '-' && c != '-')))
+                lastc = c;
+              if (c == EOF)
+                {
+                  strcpy (last_token, "End Of File");
+                  return 0;
+                }
+              else
+                {
+                  if (c == '\n')
+                    line_number++;
+                  continue;     /* next char, please! (repeat the search) */
+                }
+            }
+        }
+      string[counter++] = c;
+      /* Till the end of the token */
+      while (!
+             ((c = fgetc (file_asn1)) == EOF || c == ' ' || c == '\t'
+              || c == '\n' || c == '(' || c == ')' || c == '[' || c == ']'
+              || c == '{' || c == '}' || c == ',' || c == '.'))
+        {
+          if (counter >= ASN1_MAX_NAME_SIZE)
+            {
+              result_parse = ASN1_NAME_TOO_LONG;
+              return 0;
+            }
+          string[counter++] = c;
+        }
+      ungetc (c, file_asn1);
+      string[counter] = 0;
+      strcpy (last_token, string);
+
+      /* Is STRING a number? */
+      for (k = 0; k < counter; k++)
+        if (!isdigit (string[k]))
+          break;
+      if (k >= counter)
+        {
+          strcpy (yylval.str, string);
+          return NUM;           /* return the number */
+        }
 
-    /* Is STRING a keyword? */
-    for(i=0;i<(sizeof(key_word)/sizeof(char*));i++)
-      if(!strcmp(string,key_word[i])) return key_word_token[i];
+      /* Is STRING a keyword? */
+      for (i = 0; i < (sizeof (key_word) / sizeof (char *)); i++)
+        if (!strcmp (string, key_word[i]))
+          return key_word_token[i];
 
-    /* STRING is an IDENTIFIER */
-    strcpy(yylval.str,string);
-    return IDENTIFIER;
+      /* STRING is an IDENTIFIER */
+      strcpy (yylval.str, string);
+      return IDENTIFIER;
     }
 }
 
@@ -2754,129 +3008,118 @@ _asn1_yylex()
 /*    error.                                                 */
 /*  Parameters:                                              */
 /*    error : error to describe.                             */
-/*    errorDescription: string that will contain the         */
+/*    error_desc: string that will contain the         */
 /*                      description.                         */
 /*************************************************************/
 static void
-_asn1_create_errorDescription(int error,char *errorDescription)
+_asn1_create_errorDescription (int error, char *error_desc)
 {
-  switch(error){
-  case ASN1_SUCCESS: case ASN1_FILE_NOT_FOUND:
-    if (errorDescription!=NULL) errorDescription[0]=0;
-    break;
-  case ASN1_SYNTAX_ERROR:
-    if (errorDescription!=NULL) {
-       strcpy(errorDescription,fileName);
-       strcat(errorDescription,":");
-       _asn1_ltostr(lineNumber,errorDescription+strlen(fileName)+1);
-       strcat(errorDescription,": parse error near '");
-       strcat(errorDescription,lastToken);
-       strcat(errorDescription,"'");
-    }
-    break;
-  case ASN1_NAME_TOO_LONG:
-    if (errorDescription!=NULL) {
-       strcpy(errorDescription,fileName);
-       strcat(errorDescription,":");
-       _asn1_ltostr(lineNumber,errorDescription+strlen(fileName)+1);
-       strcat(errorDescription,": name too long (more than ");
-       
_asn1_ltostr(ASN1_MAX_NAME_SIZE,errorDescription+strlen(errorDescription));
-       strcat(errorDescription," characters)");
-    }
-    break;
-  case ASN1_IDENTIFIER_NOT_FOUND:
-    if (errorDescription!=NULL) {
-       strcpy(errorDescription,fileName);
-       strcat(errorDescription,":");
-       strcat(errorDescription,": identifier '");
-       strcat(errorDescription,_asn1_identifierMissing);
-       strcat(errorDescription,"' not found");
+  if (error_desc == NULL)
+    return;
+
+
+  switch (error)
+    {
+    case ASN1_SYNTAX_ERROR:
+      strcpy(error_desc, last_error);
+      break;
+    case ASN1_NAME_TOO_LONG:
+      snprintf (error_desc, ASN1_MAX_ERROR_DESCRIPTION_SIZE,
+                "%s:%u: name too long (more than %u characters)", file_name,
+                line_number, ASN1_MAX_NAME_SIZE);
+      break;
+    case ASN1_IDENTIFIER_NOT_FOUND:
+      snprintf (error_desc, ASN1_MAX_ERROR_DESCRIPTION_SIZE,
+                "%s:: identifier '%s' not found", file_name,
+                _asn1_identifierMissing);
+      break;
+    default:
+      error_desc[0] = 0;
+      break;
     }
-    break;
-  default:
-    if (errorDescription!=NULL) errorDescription[0]=0;
-    break;
-  }
 
 }
 
 /**
  * asn1_parser2tree:
- * @file_name: specify the path and the name of file that contains
+ * @file: specify the path and the name of file that contains
  *   ASN.1 declarations.
  * @definitions: return the pointer to the structure created from
- *   "file_name" ASN.1 declarations.
- * @errorDescription: return the error description or an empty
+ *   "file" ASN.1 declarations.
+ * @error_desc: return the error description or an empty
  * string if success.
  *
  * Function used to start the parse algorithm.  Creates the structures
- * needed to manage the definitions included in @file_name file.
+ * needed to manage the definitions included in @file file.
  *
  * Returns: %ASN1_SUCCESS if the file has a correct syntax and every
  *   identifier is known, %ASN1_ELEMENT_NOT_EMPTY if @definitions not
  *   %NULL, %ASN1_FILE_NOT_FOUND if an error occured while
- *   opening @file_name, %ASN1_SYNTAX_ERROR if the syntax is not
+ *   opening @file, %ASN1_SYNTAX_ERROR if the syntax is not
  *   correct, %ASN1_IDENTIFIER_NOT_FOUND if in the file there is an
  *   identifier that is not defined, %ASN1_NAME_TOO_LONG if in the
  *   file there is an identifier whith more than %ASN1_MAX_NAME_SIZE
  *   characters.
  **/
 int
-asn1_parser2tree(const char *file_name, asn1_node *definitions,
-                char *errorDescription) 
+asn1_parser2tree (const char *file, asn1_node * definitions,
+                  char *error_desc)
 {
 
-  p_tree=NULL;
+  p_tree = NULL;
 
-  if(*definitions != NULL)
+  if (*definitions != NULL)
     return ASN1_ELEMENT_NOT_EMPTY;
 
-  *definitions=NULL;
+  *definitions = NULL;
 
-  fileName = file_name;
+  file_name = file;
 
   /* open the file to parse */
-  file_asn1=fopen(file_name,"r");
+  file_asn1 = fopen (file, "r");
 
-  if(file_asn1==NULL){
-    result_parse=ASN1_FILE_NOT_FOUND;
-  }
-  else{
-    result_parse=ASN1_SUCCESS;
-
-    lineNumber=1;
-    yyparse();
-
-    fclose(file_asn1);
-
-    if(result_parse==ASN1_SUCCESS){ /* syntax OK */
-      /* set IMPLICIT or EXPLICIT property */
-      _asn1_set_default_tag(p_tree);
-      /* set CONST_SET and CONST_NOT_USED */
-      _asn1_type_set_config(p_tree);
-      /* check the identifier definitions */
-      result_parse=_asn1_check_identifier(p_tree);
-      if(result_parse==ASN1_SUCCESS){ /* all identifier defined */
-       /* Delete the list and keep the ASN1 structure */
-       _asn1_delete_list();
-       /* Convert into DER coding the value assign to INTEGER constants */
-       _asn1_change_integer_value(p_tree);
-       /* Expand the IDs of OBJECT IDENTIFIER constants */
-       _asn1_expand_object_id(p_tree);
-
-       *definitions=p_tree;
-      }
-      else /* some identifiers not defined */
-       /* Delete the list and the ASN1 structure */
-       _asn1_delete_list_and_nodes();
+  if (file_asn1 == NULL)
+    {
+      result_parse = ASN1_FILE_NOT_FOUND;
+    }
+  else
+    {
+      result_parse = ASN1_SUCCESS;
+
+      line_number = 1;
+      yyparse ();
+
+      fclose (file_asn1);
+
+      if (result_parse == ASN1_SUCCESS)
+        {                       /* syntax OK */
+          /* set IMPLICIT or EXPLICIT property */
+          _asn1_set_default_tag (p_tree);
+          /* set CONST_SET and CONST_NOT_USED */
+          _asn1_type_set_config (p_tree);
+          /* check the identifier definitions */
+          result_parse = _asn1_check_identifier (p_tree);
+          if (result_parse == ASN1_SUCCESS)
+            {                   /* all identifier defined */
+              /* Delete the list and keep the ASN1 structure */
+              _asn1_delete_list ();
+              /* Convert into DER coding the value assign to INTEGER constants 
*/
+              _asn1_change_integer_value (p_tree);
+              /* Expand the IDs of OBJECT IDENTIFIER constants */
+              _asn1_expand_object_id (p_tree);
+
+              *definitions = p_tree;
+            }
+          else                  /* some identifiers not defined */
+            /* Delete the list and the ASN1 structure */
+            _asn1_delete_list_and_nodes ();
+        }
+      else                      /* syntax error */
+        /* Delete the list and the ASN1 structure */
+        _asn1_delete_list_and_nodes ();
     }
-    else  /* syntax error */
-      /* Delete the list and the ASN1 structure */
-      _asn1_delete_list_and_nodes();
-  }
 
-  if (errorDescription!=NULL)
-       _asn1_create_errorDescription(result_parse,errorDescription);
+  _asn1_create_errorDescription (result_parse, error_desc);
 
   return result_parse;
 }
@@ -2888,7 +3131,7 @@ asn1_parser2tree(const char *file_name, asn1_node 
*definitions,
  * @outputFileName: specify the path and the name of file that will
  *   contain the C vector definition.
  * @vectorName: specify the name of the C vector.
- * @errorDescription : return the error description or an empty
+ * @error_desc : return the error description or an empty
  *   string if success.
  *
  * Function that generates a C structure from an ASN1 file.  Creates a
@@ -2906,98 +3149,110 @@ asn1_parser2tree(const char *file_name, asn1_node 
*definitions,
  *   file there is an identifier whith more than %ASN1_MAX_NAME_SIZE
  *   characters.
  **/
-int asn1_parser2array(const char *inputFileName,const char *outputFileName,
-                     const char *vectorName,char *errorDescription){
-  char *file_out_name=NULL;
-  char *vector_name=NULL;
-  const char *char_p,*slash_p,*dot_p;
+int
+asn1_parser2array (const char *inputFileName, const char *outputFileName,
+                   const char *vectorName, char *error_desc)
+{
+  char *file_out_name = NULL;
+  char *vector_name = NULL;
+  const char *char_p, *slash_p, *dot_p;
 
-  p_tree=NULL;
+  p_tree = NULL;
 
-  fileName = inputFileName;
+  file_name = inputFileName;
 
   /* open the file to parse */
-  file_asn1=fopen(inputFileName,"r");
-
-  if(file_asn1==NULL)
-    result_parse=ASN1_FILE_NOT_FOUND;
-  else{
-    result_parse=ASN1_SUCCESS;
-
-    lineNumber=1;
-    yyparse();
-
-    fclose(file_asn1);
-
-    if(result_parse==ASN1_SUCCESS){ /* syntax OK */
-      /* set IMPLICIT or EXPLICIT property */
-      _asn1_set_default_tag(p_tree);
-      /* set CONST_SET and CONST_NOT_USED */
-      _asn1_type_set_config(p_tree);
-      /* check the identifier definitions */
-      result_parse=_asn1_check_identifier(p_tree);
-
-      if(result_parse==ASN1_SUCCESS){ /* all identifier defined */
-
-       /* searching the last '/' and '.' in inputFileName */
-       char_p=inputFileName;
-       slash_p=inputFileName;
-       while((char_p=strchr(char_p,'/'))){
-         char_p++;
-         slash_p=char_p;
-       }
+  file_asn1 = fopen (inputFileName, "r");
 
-       char_p=slash_p;
-       dot_p=inputFileName+strlen(inputFileName);
-
-       while((char_p=strchr(char_p,'.'))){
-         dot_p=char_p;
-         char_p++;
-       }
-
-       if(outputFileName == NULL){
-         /* file_out_name = inputFileName + _asn1_tab.c */
-         file_out_name=malloc(dot_p-inputFileName+1+
-                                      strlen("_asn1_tab.c"));
-         memcpy(file_out_name,inputFileName,dot_p-inputFileName);
-         file_out_name[dot_p-inputFileName]=0;
-         strcat(file_out_name,"_asn1_tab.c");
-       }
-       else{
-         /* file_out_name = inputFileName */
-         file_out_name=(char *)malloc(strlen(outputFileName)+1);
-         strcpy(file_out_name,outputFileName);
-       }
-
-       if(vectorName == NULL){
-         /* vector_name = file name + _asn1_tab */
-         vector_name=malloc(dot_p-slash_p+1+
-                                    strlen("_asn1_tab"));
-         memcpy(vector_name,slash_p,dot_p-slash_p);
-         vector_name[dot_p-slash_p]=0;
-         strcat(vector_name,"_asn1_tab");
-       }
-       else{
-         /* vector_name = vectorName */
-         vector_name=(char *)malloc(strlen(vectorName)+1);
-         strcpy(vector_name,vectorName);
-       }
-
-       /* Save structure in a file */
-       _asn1_create_static_structure(p_tree,
-                                     file_out_name,vector_name);
-
-       free(file_out_name);
-       free(vector_name);
-      } /* result == OK */
-    }   /* result == OK */
+  if (file_asn1 == NULL)
+    result_parse = ASN1_FILE_NOT_FOUND;
+  else
+    {
+      result_parse = ASN1_SUCCESS;
+
+      line_number = 1;
+      yyparse ();
+
+      fclose (file_asn1);
+
+      if (result_parse == ASN1_SUCCESS)
+        {                       /* syntax OK */
+          /* set IMPLICIT or EXPLICIT property */
+          _asn1_set_default_tag (p_tree);
+          /* set CONST_SET and CONST_NOT_USED */
+          _asn1_type_set_config (p_tree);
+          /* check the identifier definitions */
+          result_parse = _asn1_check_identifier (p_tree);
+
+          if (result_parse == ASN1_SUCCESS)
+            {                   /* all identifier defined */
+
+              /* searching the last '/' and '.' in inputFileName */
+              char_p = inputFileName;
+              slash_p = inputFileName;
+              while ((char_p = strchr (char_p, '/')))
+                {
+                  char_p++;
+                  slash_p = char_p;
+                }
+
+              char_p = slash_p;
+              dot_p = inputFileName + strlen (inputFileName);
+
+              while ((char_p = strchr (char_p, '.')))
+                {
+                  dot_p = char_p;
+                  char_p++;
+                }
+
+              if (outputFileName == NULL)
+                {
+                  /* file_out_name = inputFileName + _asn1_tab.c */
+                  file_out_name = malloc (dot_p - inputFileName + 1 +
+                                          strlen ("_asn1_tab.c"));
+                  memcpy (file_out_name, inputFileName,
+                          dot_p - inputFileName);
+                  file_out_name[dot_p - inputFileName] = 0;
+                  strcat (file_out_name, "_asn1_tab.c");
+                }
+              else
+                {
+                  /* file_out_name = inputFileName */
+                  file_out_name =
+                      (char *) malloc (strlen (outputFileName) + 1);
+                  strcpy (file_out_name, outputFileName);
+                }
+
+              if (vectorName == NULL)
+                {
+                  /* vector_name = file name + _asn1_tab */
+                  vector_name = malloc (dot_p - slash_p + 1 +
+                                        strlen ("_asn1_tab"));
+                  memcpy (vector_name, slash_p, dot_p - slash_p);
+                  vector_name[dot_p - slash_p] = 0;
+                  strcat (vector_name, "_asn1_tab");
+                }
+              else
+                {
+                  /* vector_name = vectorName */
+                  vector_name = (char *) malloc (strlen (vectorName) + 1);
+                  strcpy (vector_name, vectorName);
+                }
+
+              /* Save structure in a file */
+              _asn1_create_static_structure (p_tree,
+                                             file_out_name, vector_name);
+
+              free (file_out_name);
+              free (vector_name);
+            }                   /* result == OK */
+        }                       /* result == OK */
 
-    /* Delete the list and the ASN1 structure */
-    _asn1_delete_list_and_nodes();
-  } /* inputFile exist */
+      /* Delete the list and the ASN1 structure */
+      _asn1_delete_list_and_nodes ();
+    }                           /* inputFile exist */
 
-  if (errorDescription!=NULL)
-       _asn1_create_errorDescription(result_parse,errorDescription);
+  _asn1_create_errorDescription (result_parse, error_desc);
 
   return result_parse;
 }
@@ -3010,18 +3265,35 @@ int asn1_parser2array(const char *inputFileName,const 
char *outputFileName,
 /*  Return: int                                              */
 /*                                                           */
 /*************************************************************/
-static int _asn1_yyerror (const char *s)
+static void
+_asn1_yyerror (const char *s)
 {
   /* Sends the error description to the std_out */
 
-#if 0
-  printf("_asn1_yyerror:%s:%ld: %s (Last Token:'%s')\n",fileName,
-        lineNumber,s,lastToken);
-#endif
+  if (strcmp (last_token, "VisibleString") == 0 ||
+      strcmp (last_token, "PrintableString") == 0 ||
+      strcmp (last_token, "UniversalString") == 0 ||
+      strcmp (last_token, "IA5String") == 0 ||
+      strcmp (last_token, "UTF8String") == 0 ||
+      strcmp (last_token, "NumericString") == 0 ||
+      strcmp (last_token, "TeletexString") == 0 ||
+      strcmp (last_token, "BMPString") == 0)
+    {
+      fprintf(stderr, 
+               "%s:%ld: Warning: %s is a built-in ASN.1 type.\n",
+               file_name, line_number, last_token);
+      return;
+    }
 
-  if(result_parse!=ASN1_NAME_TOO_LONG)
-    result_parse=ASN1_SYNTAX_ERROR;
 
-  return 0;
+  if (result_parse != ASN1_NAME_TOO_LONG)
+    {
+      snprintf (last_error, ASN1_MAX_ERROR_DESCRIPTION_SIZE,
+                "%s:%ld: Error: %s near '%s'", file_name,
+                line_number, s, last_token);
+      result_parse = ASN1_SYNTAX_ERROR;
+    }
+
+  return;
 }
 
diff --git a/lib/ASN1.y b/lib/ASN1.y
index 69f43b5..c5bca99 100644
--- a/lib/ASN1.y
+++ b/lib/ASN1.y
@@ -30,28 +30,32 @@
 #include <int.h>
 #include <parser_aux.h>
 #include <structure.h>
+#include <libtasn1.h>
 
 static FILE *file_asn1;                        /* Pointer to file to parse */
-static int result_parse;       /* result of the parser
+static int result_parse = 0;   /* result of the parser
                                           algorithm */
 static asn1_node p_tree;               /* pointer to the root of the
                                           structure created by the
                                           parser*/
-static unsigned long lineNumber;       /* line number describing the
+static unsigned int line_number;       /* line number describing the
                                           parser position inside the
                                           file */
-static char lastToken[ASN1_MAX_NAME_SIZE+1];   /* last token find in the file
+static char last_error[ASN1_MAX_ERROR_DESCRIPTION_SIZE] = "";
+static char last_token[ASN1_MAX_NAME_SIZE+1];  /* last token find in the file
                                           to parse before the 'parse
                                           error' */
 extern char _asn1_identifierMissing[];
-static const char *fileName;           /* file to parse */
+static const char *file_name;          /* file to parse */
 
-static int _asn1_yyerror (const char *);
+static void _asn1_yyerror (const char *);
 static int _asn1_yylex(void);
 
 %}
 
 /* Prefix symbols and functions with _asn1_ */
+/* %define parse.lac full */
+%error-verbose
 %name-prefix="_asn1_yy"
 
 %union {
@@ -96,6 +100,15 @@ static int _asn1_yylex(void);
 %token UTCTime
 %token GeneralizedTime
 %token GeneralString
+%token NumericString
+%token IA5String
+%token TeletexString
+%token PrintableString
+%token UniversalString
+%token BMPString
+%token UTF8String
+%token VisibleString
+
 %token FROM
 %token IMPORTS
 %token ENUMERATED
@@ -107,6 +120,8 @@ static int _asn1_yylex(void);
 %type <node> constant_def type_constant type_constant_list definitions
 %type <node> definitions_id Time bit_element bit_element_list set_def
 %type <node> tag_type tag type_assig_right_tag generalstring_def
+%type <node> numericstring_def ia5string_def printablestring_def 
universalstring_def
+%type <node> bmpstring_def utf8string_def visiblestring_def teletexstring_def
 %type <node> type_assig_right_tag_default enumerated_def
 %type <str>  pos_num neg_num pos_neg_num pos_neg_identifier pos_neg_list
 %type <str>  num_identifier
@@ -118,7 +133,7 @@ static int _asn1_yylex(void);
 definitions:   definitions_id
                DEFINITIONS explicit_implicit TAGS "::=" BEGIN  /* imports_def 
*/
                type_constant_list END
-                   {$$=_asn1_add_static_node(TYPE_DEFINITIONS|$3);
+                   {$$=_asn1_add_static_node(ASN1_ETYPE_DEFINITIONS|$3);
                     _asn1_set_name($$,_asn1_get_name($1));
                     _asn1_set_name($1,"");
                     _asn1_set_right($1,$7);
@@ -148,9 +163,9 @@ pos_neg_identifier :  pos_neg_num    {strcpy($$,$1);}
                     | IDENTIFIER     {strcpy($$,$1);}
 ;
 
-constant: '(' pos_neg_num ')'         {$$=_asn1_add_static_node(TYPE_CONSTANT);
+constant: '(' pos_neg_num ')'         
{$$=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
                                        _asn1_set_value($$,$2,strlen($2)+1);}
-        | IDENTIFIER'('pos_neg_num')' {$$=_asn1_add_static_node(TYPE_CONSTANT);
+        | IDENTIFIER'('pos_neg_num')' 
{$$=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
                                       _asn1_set_name($$,$1);
                                        _asn1_set_value($$,$3,strlen($3)+1);}
 ;
@@ -160,9 +175,9 @@ constant_list:  constant                   {$$=$1;}
                                             
_asn1_set_right(_asn1_get_last_right($1),$3);}
 ;
 
-obj_constant:  num_identifier     {$$=_asn1_add_static_node(TYPE_CONSTANT);
+obj_constant:  num_identifier     
{$$=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
                                    _asn1_set_value($$,$1,strlen($1)+1);}
-             | IDENTIFIER'('NUM')' {$$=_asn1_add_static_node(TYPE_CONSTANT);
+             | IDENTIFIER'('NUM')' 
{$$=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
                                    _asn1_set_name($$,$1);
                                     _asn1_set_value($$,$3,strlen($3)+1);}
 ;
@@ -177,9 +192,9 @@ class :  UNIVERSAL    {$$=CONST_UNIVERSAL;}
        | APPLICATION  {$$=CONST_APPLICATION;}
 ;
 
-tag_type :  '[' NUM ']'    {$$=_asn1_add_static_node(TYPE_TAG);
+tag_type :  '[' NUM ']'    {$$=_asn1_add_static_node(ASN1_ETYPE_TAG);
                             _asn1_set_value($$,$2,strlen($2)+1);}
-          | '[' class NUM ']'  {$$=_asn1_add_static_node(TYPE_TAG | $2);
+          | '[' class NUM ']'  {$$=_asn1_add_static_node(ASN1_ETYPE_TAG | $2);
                                 _asn1_set_value($$,$3,strlen($3)+1);}
 ;
 
@@ -188,10 +203,10 @@ tag :  tag_type           {$$=$1;}
      | tag_type IMPLICIT  {$$=_asn1_mod_type($1,CONST_IMPLICIT);}
 ;
 
-default :  DEFAULT pos_neg_identifier {$$=_asn1_add_static_node(TYPE_DEFAULT);
+default :  DEFAULT pos_neg_identifier 
{$$=_asn1_add_static_node(ASN1_ETYPE_DEFAULT);
                                        _asn1_set_value($$,$2,strlen($2)+1);}
-         | DEFAULT ASN1_TRUE           
{$$=_asn1_add_static_node(TYPE_DEFAULT|CONST_TRUE);}
-         | DEFAULT ASN1_FALSE          
{$$=_asn1_add_static_node(TYPE_DEFAULT|CONST_FALSE);}
+         | DEFAULT ASN1_TRUE           
{$$=_asn1_add_static_node(ASN1_ETYPE_DEFAULT|CONST_TRUE);}
+         | DEFAULT ASN1_FALSE          
{$$=_asn1_add_static_node(ASN1_ETYPE_DEFAULT|CONST_FALSE);}
 ;
 
 
@@ -200,28 +215,28 @@ pos_neg_list:  pos_neg_num
 ;
 
 
-integer_def: INTEGER                    
{$$=_asn1_add_static_node(TYPE_INTEGER);}
-           | INTEGER'{'constant_list'}' 
{$$=_asn1_add_static_node(TYPE_INTEGER|CONST_LIST);
+integer_def: INTEGER                    
{$$=_asn1_add_static_node(ASN1_ETYPE_INTEGER);}
+           | INTEGER'{'constant_list'}' 
{$$=_asn1_add_static_node(ASN1_ETYPE_INTEGER|CONST_LIST);
                                         _asn1_set_down($$,$3);}
-           | integer_def'(' pos_neg_list ')' 
{$$=_asn1_add_static_node(TYPE_INTEGER);}
+           | integer_def'(' pos_neg_list ')' 
{$$=_asn1_add_static_node(ASN1_ETYPE_INTEGER);}
            | integer_def'('num_identifier'.''.'num_identifier')'
-                                        
{$$=_asn1_add_static_node(TYPE_INTEGER|CONST_MIN_MAX);
-                                         
_asn1_set_down($$,_asn1_add_static_node(TYPE_SIZE));
+                                        
{$$=_asn1_add_static_node(ASN1_ETYPE_INTEGER|CONST_MIN_MAX);
+                                         
_asn1_set_down($$,_asn1_add_static_node(ASN1_ETYPE_SIZE));
                                          
_asn1_set_value(_asn1_get_down($$),$6,strlen($6)+1);
                                          
_asn1_set_name(_asn1_get_down($$),$3);}
 ;
 
-boolean_def: BOOLEAN   {$$=_asn1_add_static_node(TYPE_BOOLEAN);}
+boolean_def: BOOLEAN   {$$=_asn1_add_static_node(ASN1_ETYPE_BOOLEAN);}
 ;
 
-Time:   UTCTime          {$$=_asn1_add_static_node(TYPE_TIME|CONST_UTC);}
-      | GeneralizedTime  
{$$=_asn1_add_static_node(TYPE_TIME|CONST_GENERALIZED);}
+Time:   UTCTime          {$$=_asn1_add_static_node(ASN1_ETYPE_TIME|CONST_UTC);}
+      | GeneralizedTime  
{$$=_asn1_add_static_node(ASN1_ETYPE_TIME|CONST_GENERALIZED);}
 ;
 
-size_def2: SIZE'('num_identifier')'  
{$$=_asn1_add_static_node(TYPE_SIZE|CONST_1_PARAM);
+size_def2: SIZE'('num_identifier')'  
{$$=_asn1_add_static_node(ASN1_ETYPE_SIZE|CONST_1_PARAM);
                                      _asn1_set_value($$,$3,strlen($3)+1);}
         | SIZE'('num_identifier'.''.'num_identifier')'
-                                     
{$$=_asn1_add_static_node(TYPE_SIZE|CONST_MIN_MAX);
+                                     
{$$=_asn1_add_static_node(ASN1_ETYPE_SIZE|CONST_MIN_MAX);
                                      _asn1_set_value($$,$3,strlen($3)+1);
                                       _asn1_set_name($$,$6);}
 ;
@@ -230,17 +245,57 @@ size_def:   size_def2          {$$=$1;}
           | '(' size_def2 ')'  {$$=$2;}
 ;
 
-generalstring_def: GeneralString 
{$$=_asn1_add_static_node(TYPE_GENERALSTRING);}
-                | GeneralString size_def 
{$$=_asn1_add_static_node(TYPE_GENERALSTRING|CONST_SIZE);
+generalstring_def: GeneralString 
{$$=_asn1_add_static_node(ASN1_ETYPE_GENERALSTRING);}
+                | GeneralString size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_GENERALSTRING|CONST_SIZE);
+                                         _asn1_set_down($$,$2);}
+;
+
+numericstring_def: NumericString 
{$$=_asn1_add_static_node(ASN1_ETYPE_NUMERICSTRING|CONST_UNIVERSAL);}
+                | NumericString size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_NUMERICSTRING|CONST_SIZE);
+                                         _asn1_set_down($$,$2);}
+;
+
+ia5string_def: IA5String {$$=_asn1_add_static_node(ASN1_ETYPE_IA5STRING);}
+                | IA5String size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_IA5STRING|CONST_SIZE);
                                          _asn1_set_down($$,$2);}
 ;
 
-octet_string_def : OCTET STRING           
{$$=_asn1_add_static_node(TYPE_OCTET_STRING);}
-                 | OCTET STRING size_def  
{$$=_asn1_add_static_node(TYPE_OCTET_STRING|CONST_SIZE);
+teletexstring_def: TeletexString 
{$$=_asn1_add_static_node(ASN1_ETYPE_TELETEXSTRING);}
+                | TeletexString size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_TELETEXSTRING|CONST_SIZE);
+                                         _asn1_set_down($$,$2);}
+;
+
+printablestring_def: PrintableString 
{$$=_asn1_add_static_node(ASN1_ETYPE_PRINTABLESTRING);}
+                | PrintableString size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_PRINTABLESTRING|CONST_SIZE);
+                                         _asn1_set_down($$,$2);}
+;
+
+universalstring_def: UniversalString 
{$$=_asn1_add_static_node(ASN1_ETYPE_UNIVERSALSTRING);}
+                | UniversalString size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_UNIVERSALSTRING|CONST_SIZE);
+                                         _asn1_set_down($$,$2);}
+;
+
+bmpstring_def: BMPString {$$=_asn1_add_static_node(ASN1_ETYPE_BMPSTRING);}
+                | BMPString size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_BMPSTRING|CONST_SIZE);
+                                         _asn1_set_down($$,$2);}
+;
+
+utf8string_def: UTF8String {$$=_asn1_add_static_node(ASN1_ETYPE_UTF8STRING);}
+                | UTF8String size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_UTF8STRING|CONST_SIZE);
+                                         _asn1_set_down($$,$2);}
+;
+
+visiblestring_def: VisibleString 
{$$=_asn1_add_static_node(ASN1_ETYPE_VISIBLESTRING);}
+                | VisibleString size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_VISIBLESTRING|CONST_SIZE);
+                                         _asn1_set_down($$,$2);}
+;
+
+octet_string_def : OCTET STRING           
{$$=_asn1_add_static_node(ASN1_ETYPE_OCTET_STRING);}
+                 | OCTET STRING size_def  
{$$=_asn1_add_static_node(ASN1_ETYPE_OCTET_STRING|CONST_SIZE);
                                            _asn1_set_down($$,$3);}
 ;
 
-bit_element :  IDENTIFIER'('NUM')' {$$=_asn1_add_static_node(TYPE_CONSTANT);
+bit_element :  IDENTIFIER'('NUM')' 
{$$=_asn1_add_static_node(ASN1_ETYPE_CONSTANT);
                                   _asn1_set_name($$,$1);
                                     _asn1_set_value($$,$3,strlen($3)+1);}
 ;
@@ -250,25 +305,25 @@ bit_element_list :  bit_element   {$$=$1;}
                                                        
_asn1_set_right(_asn1_get_last_right($1),$3);}
 ;
 
-bit_string_def : BIT STRING    {$$=_asn1_add_static_node(TYPE_BIT_STRING);}
-               | BIT STRING size_def 
{$$=_asn1_add_static_node(TYPE_BIT_STRING|CONST_SIZE);}
+bit_string_def : BIT STRING    
{$$=_asn1_add_static_node(ASN1_ETYPE_BIT_STRING);}
+               | BIT STRING size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_BIT_STRING|CONST_SIZE);}
                | BIT STRING'{'bit_element_list'}'
-                               
{$$=_asn1_add_static_node(TYPE_BIT_STRING|CONST_LIST);
+                               
{$$=_asn1_add_static_node(ASN1_ETYPE_BIT_STRING|CONST_LIST);
                                 _asn1_set_down($$,$4);}
 ;
 
 enumerated_def : ENUMERATED'{'bit_element_list'}'
-                               
{$$=_asn1_add_static_node(TYPE_ENUMERATED|CONST_LIST);
+                               
{$$=_asn1_add_static_node(ASN1_ETYPE_ENUMERATED|CONST_LIST);
                                 _asn1_set_down($$,$3);}
 ;
 
 
-object_def :  OBJECT STR_IDENTIFIER {$$=_asn1_add_static_node(TYPE_OBJECT_ID);}
+object_def :  OBJECT STR_IDENTIFIER 
{$$=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID);}
 ;
 
-type_assig_right: IDENTIFIER          
{$$=_asn1_add_static_node(TYPE_IDENTIFIER);
+type_assig_right: IDENTIFIER          
{$$=_asn1_add_static_node(ASN1_ETYPE_IDENTIFIER);
                                        _asn1_set_value($$,$1,strlen($1)+1);}
-                | IDENTIFIER size_def 
{$$=_asn1_add_static_node(TYPE_IDENTIFIER|CONST_SIZE);
+                | IDENTIFIER size_def 
{$$=_asn1_add_static_node(ASN1_ETYPE_IDENTIFIER|CONST_SIZE);
                                        _asn1_set_value($$,$1,strlen($1)+1);
                                        _asn1_set_down($$,$2);}
                 | integer_def         {$$=$1;}
@@ -278,12 +333,20 @@ type_assig_right: IDENTIFIER          
{$$=_asn1_add_static_node(TYPE_IDENTIFIER)
                 | octet_string_def    {$$=$1;}
                 | bit_string_def      {$$=$1;}
                 | generalstring_def   {$$=$1;}
+                | numericstring_def   {$$=$1;}
+                | ia5string_def       {$$=$1;}
+                | teletexstring_def   {$$=$1;}
+                | printablestring_def {$$=$1;}
+                | universalstring_def {$$=$1;}
+                | bmpstring_def       {$$=$1;}
+                | utf8string_def      {$$=$1;}
+                | visiblestring_def   {$$=$1;}
                 | sequence_def        {$$=$1;}
                 | object_def          {$$=$1;}
                 | choise_def          {$$=$1;}
                 | any_def             {$$=$1;}
                 | set_def             {$$=$1;}
-                | TOKEN_NULL          {$$=_asn1_add_static_node(TYPE_NULL);}
+                | TOKEN_NULL          
{$$=_asn1_add_static_node(ASN1_ETYPE_NULL);}
 ;
 
 type_assig_right_tag :   type_assig_right     {$$=$1;}
@@ -307,48 +370,50 @@ type_assig_list : type_assig                   {$$=$1;}
                                                 
_asn1_set_right(_asn1_get_last_right($1),$3);}
 ;
 
-sequence_def : SEQUENCE'{'type_assig_list'}' 
{$$=_asn1_add_static_node(TYPE_SEQUENCE);
+sequence_def : SEQUENCE'{'type_assig_list'}' 
{$$=_asn1_add_static_node(ASN1_ETYPE_SEQUENCE);
                                               _asn1_set_down($$,$3);}
-   | SEQUENCE OF type_assig_right            
{$$=_asn1_add_static_node(TYPE_SEQUENCE_OF);
+   | SEQUENCE OF type_assig_right            
{$$=_asn1_add_static_node(ASN1_ETYPE_SEQUENCE_OF);
                                               _asn1_set_down($$,$3);}
-   | SEQUENCE size_def OF type_assig_right 
{$$=_asn1_add_static_node(TYPE_SEQUENCE_OF|CONST_SIZE);
+   | SEQUENCE size_def OF type_assig_right 
{$$=_asn1_add_static_node(ASN1_ETYPE_SEQUENCE_OF|CONST_SIZE);
                                             _asn1_set_right($2,$4);
                                             _asn1_set_down($$,$2);}
 ;
 
-set_def :  SET'{'type_assig_list'}' {$$=_asn1_add_static_node(TYPE_SET);
+set_def :  SET'{'type_assig_list'}' {$$=_asn1_add_static_node(ASN1_ETYPE_SET);
                                      _asn1_set_down($$,$3);}
-   | SET OF type_assig_right        {$$=_asn1_add_static_node(TYPE_SET_OF);
+   | SET OF type_assig_right        
{$$=_asn1_add_static_node(ASN1_ETYPE_SET_OF);
                                      _asn1_set_down($$,$3);}
-   | SET size_def OF type_assig_right 
{$$=_asn1_add_static_node(TYPE_SET_OF|CONST_SIZE);
+   | SET size_def OF type_assig_right 
{$$=_asn1_add_static_node(ASN1_ETYPE_SET_OF|CONST_SIZE);
                                        _asn1_set_right($2,$4);
                                        _asn1_set_down($$,$2);}
 ;
 
-choise_def :   CHOICE'{'type_assig_list'}'  
{$$=_asn1_add_static_node(TYPE_CHOICE);
+choise_def :   CHOICE'{'type_assig_list'}'  
{$$=_asn1_add_static_node(ASN1_ETYPE_CHOICE);
                                              _asn1_set_down($$,$3);}
 ;
 
-any_def :  ANY                         {$$=_asn1_add_static_node(TYPE_ANY);}
-         | ANY DEFINED BY IDENTIFIER   
{$$=_asn1_add_static_node(TYPE_ANY|CONST_DEFINED_BY);
-                                        
_asn1_set_down($$,_asn1_add_static_node(TYPE_CONSTANT));
+any_def :  ANY                         
{$$=_asn1_add_static_node(ASN1_ETYPE_ANY);}
+         | ANY DEFINED BY IDENTIFIER   
{$$=_asn1_add_static_node(ASN1_ETYPE_ANY|CONST_DEFINED_BY);
+                                        
_asn1_set_down($$,_asn1_add_static_node(ASN1_ETYPE_CONSTANT));
                                        _asn1_set_name(_asn1_get_down($$),$4);}
 ;
 
 type_def : IDENTIFIER "::=" type_assig_right_tag  {$$=_asn1_set_name($3,$1);}
+              /* below should match: BMPString ::= [UNIVERSAL 30] IMPLICIT 
OCTET STRING etc*/
+              | error type_assig_right_tag {$$=_asn1_set_name($2, "");}
 ;
 
 constant_def :  IDENTIFIER OBJECT STR_IDENTIFIER "::=" '{'obj_constant_list'}'
-                        {$$=_asn1_add_static_node(TYPE_OBJECT_ID|CONST_ASSIGN);
+                        
{$$=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID|CONST_ASSIGN);
                          _asn1_set_name($$,$1);
                          _asn1_set_down($$,$6);}
               | IDENTIFIER IDENTIFIER "::=" '{' obj_constant_list '}'
-                        
{$$=_asn1_add_static_node(TYPE_OBJECT_ID|CONST_ASSIGN|CONST_1_PARAM);
+                        
{$$=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID|CONST_ASSIGN|CONST_1_PARAM);
                          _asn1_set_name($$,$1);
                          _asn1_set_value($$,$2,strlen($2)+1);
                          _asn1_set_down($$,$5);}
               | IDENTIFIER INTEGER "::=" pos_neg_num
-                        {$$=_asn1_add_static_node(TYPE_INTEGER|CONST_ASSIGN);
+                        
{$$=_asn1_add_static_node(ASN1_ETYPE_INTEGER|CONST_ASSIGN);
                          _asn1_set_name($$,$1);
                          _asn1_set_value($$,$4,strlen($4)+1);}
 ;
@@ -362,29 +427,29 @@ type_constant_list :   type_constant    {$$=$1;}
                                                           
_asn1_set_right(_asn1_get_last_right($1),$2);}
 ;
 
-definitions_id  :  IDENTIFIER  '{' obj_constant_list '}' 
{$$=_asn1_add_static_node(TYPE_OBJECT_ID);
+definitions_id  :  IDENTIFIER  '{' obj_constant_list '}' 
{$$=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID);
                                                           
_asn1_set_down($$,$3);
                                                           
_asn1_set_name($$,$1);}
-                 | IDENTIFIER  '{' '}'                   
{$$=_asn1_add_static_node(TYPE_OBJECT_ID);
+                 | IDENTIFIER  '{' '}'                   
{$$=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID);
                                                           
_asn1_set_name($$,$1);}
-                 | IDENTIFIER                            
{$$=_asn1_add_static_node(TYPE_OBJECT_ID);
+                 | IDENTIFIER                            
{$$=_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID);
                                                           
_asn1_set_name($$,$1);}
 ;
 
 /*
-identifier_list  :  IDENTIFIER  {$$=_asn1_add_static_node(TYPE_IDENTIFIER);
+identifier_list  :  IDENTIFIER  
{$$=_asn1_add_static_node(ASN1_ETYPE_IDENTIFIER);
                                  _asn1_set_name($$,$1);}
                   | identifier_list IDENTIFIER
                                 {$$=$1;
-                                 
_asn1_set_right(_asn1_get_last_right($$),_asn1_add_static_node(TYPE_IDENTIFIER));
+                                 
_asn1_set_right(_asn1_get_last_right($$),_asn1_add_static_node(ASN1_ETYPE_IDENTIFIER));
                                  _asn1_set_name(_asn1_get_last_right($$),$2);}
 ;
 
 
 imports_def :    empty   {$$=NULL;}
               | IMPORTS identifier_list FROM IDENTIFIER obj_constant_list
-                        {$$=_asn1_add_static_node(TYPE_IMPORTS);
-                         
_asn1_set_down($$,_asn1_add_static_node(TYPE_OBJECT_ID));
+                        {$$=_asn1_add_static_node(ASN1_ETYPE_IMPORTS);
+                         
_asn1_set_down($$,_asn1_add_static_node(ASN1_ETYPE_OBJECT_ID));
                          _asn1_set_name(_asn1_get_down($$),$4);
                          _asn1_set_down(_asn1_get_down($$),$5);
                          _asn1_set_right($$,$2);}
@@ -401,21 +466,25 @@ explicit_implicit :  EXPLICIT  {$$=CONST_EXPLICIT;}
 
 
 static const char *key_word[] = {
-  "::=","OPTIONAL","INTEGER","SIZE","OCTET","STRING"
-  ,"SEQUENCE","BIT","UNIVERSAL","PRIVATE","OPTIONAL"
-  ,"DEFAULT","CHOICE","OF","OBJECT","IDENTIFIER"
-  ,"BOOLEAN","TRUE","FALSE","APPLICATION","ANY","DEFINED"
-  ,"SET","BY","EXPLICIT","IMPLICIT","DEFINITIONS","TAGS"
-  ,"BEGIN","END","UTCTime","GeneralizedTime"
-  ,"GeneralString","FROM","IMPORTS","NULL","ENUMERATED"};
+  "::=","OPTIONAL","INTEGER","SIZE","OCTET","STRING",
+  "SEQUENCE","BIT","UNIVERSAL","PRIVATE","OPTIONAL",
+  "DEFAULT","CHOICE","OF","OBJECT","IDENTIFIER",
+  "BOOLEAN","TRUE","FALSE","APPLICATION","ANY","DEFINED",
+  "SET","BY","EXPLICIT","IMPLICIT","DEFINITIONS","TAGS",
+  "BEGIN","END","UTCTime","GeneralizedTime",
+  "GeneralString","FROM","IMPORTS","NULL","ENUMERATED",
+  "NumericString", "IA5String", "TeletexString", "PrintableString",
+  "UniversalString", "BMPString", "UTF8String", "VisibleString"};
+
 static const int key_word_token[] = {
-  ASSIG,OPTIONAL,INTEGER,SIZE,OCTET,STRING
-  ,SEQUENCE,BIT,UNIVERSAL,PRIVATE,OPTIONAL
-  ,DEFAULT,CHOICE,OF,OBJECT,STR_IDENTIFIER
-  ,BOOLEAN,ASN1_TRUE,ASN1_FALSE,APPLICATION,ANY,DEFINED
-  ,SET,BY,EXPLICIT,IMPLICIT,DEFINITIONS,TAGS
-  ,BEGIN,END,UTCTime,GeneralizedTime
-  ,GeneralString,FROM,IMPORTS,TOKEN_NULL,ENUMERATED};
+  ASSIG, OPTIONAL, INTEGER, SIZE, OCTET, STRING, SEQUENCE, BIT, UNIVERSAL,
+      PRIVATE, OPTIONAL, DEFAULT, CHOICE, OF, OBJECT, STR_IDENTIFIER,
+      BOOLEAN, ASN1_TRUE, ASN1_FALSE, APPLICATION, ANY, DEFINED, SET, BY,
+      EXPLICIT, IMPLICIT, DEFINITIONS, TAGS, BEGIN, END, UTCTime,
+      GeneralizedTime, GeneralString, FROM, IMPORTS, TOKEN_NULL,
+      ENUMERATED, NumericString, IA5String, TeletexString, PrintableString,
+      UniversalString, BMPString, UTF8String, VisibleString
+};
 
 /*************************************************************/
 /*  Function: _asn1_yylex                                    */
@@ -424,83 +493,98 @@ static const int key_word_token[] = {
 /*    Token identifier or ASCII code or 0(zero: End Of File) */
 /*************************************************************/
 static int
-_asn1_yylex()
+_asn1_yylex ()
 {
-  int c,counter=0,k,lastc;
-  char string[ASN1_MAX_NAME_SIZE+1]; /* will contain the next token */
+  int c, counter = 0, k, lastc;
+  char string[ASN1_MAX_NAME_SIZE + 1];  /* will contain the next token */
   size_t i;
 
-  while(1)
+  while (1)
     {
-    while((c=fgetc(file_asn1))==' ' || c=='\t' || c=='\n')
-      if(c=='\n') lineNumber++;
-
-    if(c==EOF){
-      strcpy(lastToken,"End Of File");
-      return 0;
-    }
-
-    if(c=='(' || c==')' || c=='[' || c==']' ||
-       c=='{' || c=='}' || c==',' || c=='.' ||
-       c=='+' || c=='|'){
-      lastToken[0]=c;lastToken[1]=0;
-      return c;
-    }
-    if(c=='-'){  /* Maybe the first '-' of a comment */
-      if((c=fgetc(file_asn1))!='-'){
-       ungetc(c,file_asn1);
-       lastToken[0]='-';lastToken[1]=0;
-       return '-';
-      }
-      else{ /* Comments */
-       lastc=0;
-       counter=0;
-       /* A comment finishes at the next double hypen or the end of line */
-       while((c=fgetc(file_asn1))!=EOF && c!='\n' &&
-             (lastc!='-' || (lastc=='-' && c!='-')))
-         lastc=c;
-       if(c==EOF){
-         strcpy(lastToken,"End Of File");
-         return 0;
-       }
-       else{
-         if(c=='\n') lineNumber++;
-         continue; /* next char, please! (repeat the search) */
-       }
-      }
-    }
-    string[counter++]=c;
-    /* Till the end of the token */
-    while(!((c=fgetc(file_asn1))==EOF || c==' '|| c=='\t' || c=='\n' ||
-            c=='(' || c==')' || c=='[' || c==']' ||
-            c=='{' || c=='}' || c==',' || c=='.'))
-      {
-       if(counter>=ASN1_MAX_NAME_SIZE){
-         result_parse=ASN1_NAME_TOO_LONG;
-         return 0;
-       }
-       string[counter++]=c;
-      }
-    ungetc(c,file_asn1);
-    string[counter]=0;
-    strcpy(lastToken,string);
-
-    /* Is STRING a number? */
-    for(k=0;k<counter;k++)
-      if(!isdigit(string[k])) break;
-    if(k>=counter)
-      {
-      strcpy(yylval.str,string);
-      return NUM; /* return the number */
-      }
-
-    /* Is STRING a keyword? */
-    for(i=0;i<(sizeof(key_word)/sizeof(char*));i++)
-      if(!strcmp(string,key_word[i])) return key_word_token[i];
-
-    /* STRING is an IDENTIFIER */
-    strcpy(yylval.str,string);
-    return IDENTIFIER;
+      while ((c = fgetc (file_asn1)) == ' ' || c == '\t' || c == '\n')
+        if (c == '\n')
+          line_number++;
+
+      if (c == EOF)
+        {
+          strcpy (last_token, "End Of File");
+          return 0;
+        }
+
+      if (c == '(' || c == ')' || c == '[' || c == ']' ||
+          c == '{' || c == '}' || c == ',' || c == '.' ||
+          c == '+' || c == '|')
+        {
+          last_token[0] = c;
+          last_token[1] = 0;
+          return c;
+        }
+      if (c == '-')
+        {                       /* Maybe the first '-' of a comment */
+          if ((c = fgetc (file_asn1)) != '-')
+            {
+              ungetc (c, file_asn1);
+              last_token[0] = '-';
+              last_token[1] = 0;
+              return '-';
+            }
+          else
+            {                   /* Comments */
+              lastc = 0;
+              counter = 0;
+              /* A comment finishes at the next double hypen or the end of 
line */
+              while ((c = fgetc (file_asn1)) != EOF && c != '\n' &&
+                     (lastc != '-' || (lastc == '-' && c != '-')))
+                lastc = c;
+              if (c == EOF)
+                {
+                  strcpy (last_token, "End Of File");
+                  return 0;
+                }
+              else
+                {
+                  if (c == '\n')
+                    line_number++;
+                  continue;     /* next char, please! (repeat the search) */
+                }
+            }
+        }
+      string[counter++] = c;
+      /* Till the end of the token */
+      while (!
+             ((c = fgetc (file_asn1)) == EOF || c == ' ' || c == '\t'
+              || c == '\n' || c == '(' || c == ')' || c == '[' || c == ']'
+              || c == '{' || c == '}' || c == ',' || c == '.'))
+        {
+          if (counter >= ASN1_MAX_NAME_SIZE)
+            {
+              result_parse = ASN1_NAME_TOO_LONG;
+              return 0;
+            }
+          string[counter++] = c;
+        }
+      ungetc (c, file_asn1);
+      string[counter] = 0;
+      strcpy (last_token, string);
+
+      /* Is STRING a number? */
+      for (k = 0; k < counter; k++)
+        if (!isdigit (string[k]))
+          break;
+      if (k >= counter)
+        {
+          strcpy (yylval.str, string);
+          return NUM;           /* return the number */
+        }
+
+      /* Is STRING a keyword? */
+      for (i = 0; i < (sizeof (key_word) / sizeof (char *)); i++)
+        if (!strcmp (string, key_word[i]))
+          return key_word_token[i];
+
+      /* STRING is an IDENTIFIER */
+      strcpy (yylval.str, string);
+      return IDENTIFIER;
     }
 }
 
@@ -510,129 +594,118 @@ _asn1_yylex()
 /*    error.                                                 */
 /*  Parameters:                                              */
 /*    error : error to describe.                             */
-/*    errorDescription: string that will contain the         */
+/*    error_desc: string that will contain the         */
 /*                      description.                         */
 /*************************************************************/
 static void
-_asn1_create_errorDescription(int error,char *errorDescription)
+_asn1_create_errorDescription (int error, char *error_desc)
 {
-  switch(error){
-  case ASN1_SUCCESS: case ASN1_FILE_NOT_FOUND:
-    if (errorDescription!=NULL) errorDescription[0]=0;
-    break;
-  case ASN1_SYNTAX_ERROR:
-    if (errorDescription!=NULL) {
-       strcpy(errorDescription,fileName);
-       strcat(errorDescription,":");
-       _asn1_ltostr(lineNumber,errorDescription+strlen(fileName)+1);
-       strcat(errorDescription,": parse error near '");
-       strcat(errorDescription,lastToken);
-       strcat(errorDescription,"'");
-    }
-    break;
-  case ASN1_NAME_TOO_LONG:
-    if (errorDescription!=NULL) {
-       strcpy(errorDescription,fileName);
-       strcat(errorDescription,":");
-       _asn1_ltostr(lineNumber,errorDescription+strlen(fileName)+1);
-       strcat(errorDescription,": name too long (more than ");
-       
_asn1_ltostr(ASN1_MAX_NAME_SIZE,errorDescription+strlen(errorDescription));
-       strcat(errorDescription," characters)");
-    }
-    break;
-  case ASN1_IDENTIFIER_NOT_FOUND:
-    if (errorDescription!=NULL) {
-       strcpy(errorDescription,fileName);
-       strcat(errorDescription,":");
-       strcat(errorDescription,": identifier '");
-       strcat(errorDescription,_asn1_identifierMissing);
-       strcat(errorDescription,"' not found");
+  if (error_desc == NULL)
+    return;
+
+
+  switch (error)
+    {
+    case ASN1_SYNTAX_ERROR:
+      strcpy(error_desc, last_error);
+      break;
+    case ASN1_NAME_TOO_LONG:
+      snprintf (error_desc, ASN1_MAX_ERROR_DESCRIPTION_SIZE,
+                "%s:%u: name too long (more than %u characters)", file_name,
+                line_number, ASN1_MAX_NAME_SIZE);
+      break;
+    case ASN1_IDENTIFIER_NOT_FOUND:
+      snprintf (error_desc, ASN1_MAX_ERROR_DESCRIPTION_SIZE,
+                "%s:: identifier '%s' not found", file_name,
+                _asn1_identifierMissing);
+      break;
+    default:
+      error_desc[0] = 0;
+      break;
     }
-    break;
-  default:
-    if (errorDescription!=NULL) errorDescription[0]=0;
-    break;
-  }
 
 }
 
 /**
  * asn1_parser2tree:
- * @file_name: specify the path and the name of file that contains
+ * @file: specify the path and the name of file that contains
  *   ASN.1 declarations.
  * @definitions: return the pointer to the structure created from
- *   "file_name" ASN.1 declarations.
- * @errorDescription: return the error description or an empty
+ *   "file" ASN.1 declarations.
+ * @error_desc: return the error description or an empty
  * string if success.
  *
  * Function used to start the parse algorithm.  Creates the structures
- * needed to manage the definitions included in @file_name file.
+ * needed to manage the definitions included in @file file.
  *
  * Returns: %ASN1_SUCCESS if the file has a correct syntax and every
  *   identifier is known, %ASN1_ELEMENT_NOT_EMPTY if @definitions not
  *   %NULL, %ASN1_FILE_NOT_FOUND if an error occured while
- *   opening @file_name, %ASN1_SYNTAX_ERROR if the syntax is not
+ *   opening @file, %ASN1_SYNTAX_ERROR if the syntax is not
  *   correct, %ASN1_IDENTIFIER_NOT_FOUND if in the file there is an
  *   identifier that is not defined, %ASN1_NAME_TOO_LONG if in the
  *   file there is an identifier whith more than %ASN1_MAX_NAME_SIZE
  *   characters.
  **/
 int
-asn1_parser2tree(const char *file_name, asn1_node *definitions,
-                char *errorDescription) 
+asn1_parser2tree (const char *file, asn1_node * definitions,
+                  char *error_desc)
 {
 
-  p_tree=NULL;
+  p_tree = NULL;
 
-  if(*definitions != NULL)
+  if (*definitions != NULL)
     return ASN1_ELEMENT_NOT_EMPTY;
 
-  *definitions=NULL;
+  *definitions = NULL;
 
-  fileName = file_name;
+  file_name = file;
 
   /* open the file to parse */
-  file_asn1=fopen(file_name,"r");
-
-  if(file_asn1==NULL){
-    result_parse=ASN1_FILE_NOT_FOUND;
-  }
-  else{
-    result_parse=ASN1_SUCCESS;
-
-    lineNumber=1;
-    yyparse();
-
-    fclose(file_asn1);
-
-    if(result_parse==ASN1_SUCCESS){ /* syntax OK */
-      /* set IMPLICIT or EXPLICIT property */
-      _asn1_set_default_tag(p_tree);
-      /* set CONST_SET and CONST_NOT_USED */
-      _asn1_type_set_config(p_tree);
-      /* check the identifier definitions */
-      result_parse=_asn1_check_identifier(p_tree);
-      if(result_parse==ASN1_SUCCESS){ /* all identifier defined */
-       /* Delete the list and keep the ASN1 structure */
-       _asn1_delete_list();
-       /* Convert into DER coding the value assign to INTEGER constants */
-       _asn1_change_integer_value(p_tree);
-       /* Expand the IDs of OBJECT IDENTIFIER constants */
-       _asn1_expand_object_id(p_tree);
-
-       *definitions=p_tree;
-      }
-      else /* some identifiers not defined */
-       /* Delete the list and the ASN1 structure */
-       _asn1_delete_list_and_nodes();
+  file_asn1 = fopen (file, "r");
+
+  if (file_asn1 == NULL)
+    {
+      result_parse = ASN1_FILE_NOT_FOUND;
+    }
+  else
+    {
+      result_parse = ASN1_SUCCESS;
+
+      line_number = 1;
+      yyparse ();
+
+      fclose (file_asn1);
+
+      if (result_parse == ASN1_SUCCESS)
+        {                       /* syntax OK */
+          /* set IMPLICIT or EXPLICIT property */
+          _asn1_set_default_tag (p_tree);
+          /* set CONST_SET and CONST_NOT_USED */
+          _asn1_type_set_config (p_tree);
+          /* check the identifier definitions */
+          result_parse = _asn1_check_identifier (p_tree);
+          if (result_parse == ASN1_SUCCESS)
+            {                   /* all identifier defined */
+              /* Delete the list and keep the ASN1 structure */
+              _asn1_delete_list ();
+              /* Convert into DER coding the value assign to INTEGER constants 
*/
+              _asn1_change_integer_value (p_tree);
+              /* Expand the IDs of OBJECT IDENTIFIER constants */
+              _asn1_expand_object_id (p_tree);
+
+              *definitions = p_tree;
+            }
+          else                  /* some identifiers not defined */
+            /* Delete the list and the ASN1 structure */
+            _asn1_delete_list_and_nodes ();
+        }
+      else                      /* syntax error */
+        /* Delete the list and the ASN1 structure */
+        _asn1_delete_list_and_nodes ();
     }
-    else  /* syntax error */
-      /* Delete the list and the ASN1 structure */
-      _asn1_delete_list_and_nodes();
-  }
 
-  if (errorDescription!=NULL)
-       _asn1_create_errorDescription(result_parse,errorDescription);
+  _asn1_create_errorDescription (result_parse, error_desc);
 
   return result_parse;
 }
@@ -644,7 +717,7 @@ asn1_parser2tree(const char *file_name, asn1_node 
*definitions,
  * @outputFileName: specify the path and the name of file that will
  *   contain the C vector definition.
  * @vectorName: specify the name of the C vector.
- * @errorDescription : return the error description or an empty
+ * @error_desc : return the error description or an empty
  *   string if success.
  *
  * Function that generates a C structure from an ASN1 file.  Creates a
@@ -662,98 +735,110 @@ asn1_parser2tree(const char *file_name, asn1_node 
*definitions,
  *   file there is an identifier whith more than %ASN1_MAX_NAME_SIZE
  *   characters.
  **/
-int asn1_parser2array(const char *inputFileName,const char *outputFileName,
-                     const char *vectorName,char *errorDescription){
-  char *file_out_name=NULL;
-  char *vector_name=NULL;
-  const char *char_p,*slash_p,*dot_p;
+int
+asn1_parser2array (const char *inputFileName, const char *outputFileName,
+                   const char *vectorName, char *error_desc)
+{
+  char *file_out_name = NULL;
+  char *vector_name = NULL;
+  const char *char_p, *slash_p, *dot_p;
 
-  p_tree=NULL;
+  p_tree = NULL;
 
-  fileName = inputFileName;
+  file_name = inputFileName;
 
   /* open the file to parse */
-  file_asn1=fopen(inputFileName,"r");
-
-  if(file_asn1==NULL)
-    result_parse=ASN1_FILE_NOT_FOUND;
-  else{
-    result_parse=ASN1_SUCCESS;
-
-    lineNumber=1;
-    yyparse();
-
-    fclose(file_asn1);
-
-    if(result_parse==ASN1_SUCCESS){ /* syntax OK */
-      /* set IMPLICIT or EXPLICIT property */
-      _asn1_set_default_tag(p_tree);
-      /* set CONST_SET and CONST_NOT_USED */
-      _asn1_type_set_config(p_tree);
-      /* check the identifier definitions */
-      result_parse=_asn1_check_identifier(p_tree);
-
-      if(result_parse==ASN1_SUCCESS){ /* all identifier defined */
-
-       /* searching the last '/' and '.' in inputFileName */
-       char_p=inputFileName;
-       slash_p=inputFileName;
-       while((char_p=strchr(char_p,'/'))){
-         char_p++;
-         slash_p=char_p;
-       }
-
-       char_p=slash_p;
-       dot_p=inputFileName+strlen(inputFileName);
-
-       while((char_p=strchr(char_p,'.'))){
-         dot_p=char_p;
-         char_p++;
-       }
-
-       if(outputFileName == NULL){
-         /* file_out_name = inputFileName + _asn1_tab.c */
-         file_out_name=malloc(dot_p-inputFileName+1+
-                                      strlen("_asn1_tab.c"));
-         memcpy(file_out_name,inputFileName,dot_p-inputFileName);
-         file_out_name[dot_p-inputFileName]=0;
-         strcat(file_out_name,"_asn1_tab.c");
-       }
-       else{
-         /* file_out_name = inputFileName */
-         file_out_name=(char *)malloc(strlen(outputFileName)+1);
-         strcpy(file_out_name,outputFileName);
-       }
-
-       if(vectorName == NULL){
-         /* vector_name = file name + _asn1_tab */
-         vector_name=malloc(dot_p-slash_p+1+
-                                    strlen("_asn1_tab"));
-         memcpy(vector_name,slash_p,dot_p-slash_p);
-         vector_name[dot_p-slash_p]=0;
-         strcat(vector_name,"_asn1_tab");
-       }
-       else{
-         /* vector_name = vectorName */
-         vector_name=(char *)malloc(strlen(vectorName)+1);
-         strcpy(vector_name,vectorName);
-       }
-
-       /* Save structure in a file */
-       _asn1_create_static_structure(p_tree,
-                                     file_out_name,vector_name);
-
-       free(file_out_name);
-       free(vector_name);
-      } /* result == OK */
-    }   /* result == OK */
-
-    /* Delete the list and the ASN1 structure */
-    _asn1_delete_list_and_nodes();
-  } /* inputFile exist */
-
-  if (errorDescription!=NULL)
-       _asn1_create_errorDescription(result_parse,errorDescription);
+  file_asn1 = fopen (inputFileName, "r");
+
+  if (file_asn1 == NULL)
+    result_parse = ASN1_FILE_NOT_FOUND;
+  else
+    {
+      result_parse = ASN1_SUCCESS;
+
+      line_number = 1;
+      yyparse ();
+
+      fclose (file_asn1);
+
+      if (result_parse == ASN1_SUCCESS)
+        {                       /* syntax OK */
+          /* set IMPLICIT or EXPLICIT property */
+          _asn1_set_default_tag (p_tree);
+          /* set CONST_SET and CONST_NOT_USED */
+          _asn1_type_set_config (p_tree);
+          /* check the identifier definitions */
+          result_parse = _asn1_check_identifier (p_tree);
+
+          if (result_parse == ASN1_SUCCESS)
+            {                   /* all identifier defined */
+
+              /* searching the last '/' and '.' in inputFileName */
+              char_p = inputFileName;
+              slash_p = inputFileName;
+              while ((char_p = strchr (char_p, '/')))
+                {
+                  char_p++;
+                  slash_p = char_p;
+                }
+
+              char_p = slash_p;
+              dot_p = inputFileName + strlen (inputFileName);
+
+              while ((char_p = strchr (char_p, '.')))
+                {
+                  dot_p = char_p;
+                  char_p++;
+                }
+
+              if (outputFileName == NULL)
+                {
+                  /* file_out_name = inputFileName + _asn1_tab.c */
+                  file_out_name = malloc (dot_p - inputFileName + 1 +
+                                          strlen ("_asn1_tab.c"));
+                  memcpy (file_out_name, inputFileName,
+                          dot_p - inputFileName);
+                  file_out_name[dot_p - inputFileName] = 0;
+                  strcat (file_out_name, "_asn1_tab.c");
+                }
+              else
+                {
+                  /* file_out_name = inputFileName */
+                  file_out_name =
+                      (char *) malloc (strlen (outputFileName) + 1);
+                  strcpy (file_out_name, outputFileName);
+                }
+
+              if (vectorName == NULL)
+                {
+                  /* vector_name = file name + _asn1_tab */
+                  vector_name = malloc (dot_p - slash_p + 1 +
+                                        strlen ("_asn1_tab"));
+                  memcpy (vector_name, slash_p, dot_p - slash_p);
+                  vector_name[dot_p - slash_p] = 0;
+                  strcat (vector_name, "_asn1_tab");
+                }
+              else
+                {
+                  /* vector_name = vectorName */
+                  vector_name = (char *) malloc (strlen (vectorName) + 1);
+                  strcpy (vector_name, vectorName);
+                }
+
+              /* Save structure in a file */
+              _asn1_create_static_structure (p_tree,
+                                             file_out_name, vector_name);
+
+              free (file_out_name);
+              free (vector_name);
+            }                   /* result == OK */
+        }                       /* result == OK */
+
+      /* Delete the list and the ASN1 structure */
+      _asn1_delete_list_and_nodes ();
+    }                           /* inputFile exist */
+
+  _asn1_create_errorDescription (result_parse, error_desc);
 
   return result_parse;
 }
@@ -766,17 +851,34 @@ int asn1_parser2array(const char *inputFileName,const 
char *outputFileName,
 /*  Return: int                                              */
 /*                                                           */
 /*************************************************************/
-static int _asn1_yyerror (const char *s)
+static void
+_asn1_yyerror (const char *s)
 {
   /* Sends the error description to the std_out */
 
-#if 0
-  printf("_asn1_yyerror:%s:%ld: %s (Last Token:'%s')\n",fileName,
-        lineNumber,s,lastToken);
-#endif
+  if (strcmp (last_token, "VisibleString") == 0 ||
+      strcmp (last_token, "PrintableString") == 0 ||
+      strcmp (last_token, "UniversalString") == 0 ||
+      strcmp (last_token, "IA5String") == 0 ||
+      strcmp (last_token, "UTF8String") == 0 ||
+      strcmp (last_token, "NumericString") == 0 ||
+      strcmp (last_token, "TeletexString") == 0 ||
+      strcmp (last_token, "BMPString") == 0)
+    {
+      fprintf(stderr, 
+               "%s:%ld: Warning: %s is a built-in ASN.1 type.\n",
+               file_name, line_number, last_token);
+      return;
+    }
+
 
-  if(result_parse!=ASN1_NAME_TOO_LONG)
-    result_parse=ASN1_SYNTAX_ERROR;
+  if (result_parse != ASN1_NAME_TOO_LONG)
+    {
+      snprintf (last_error, ASN1_MAX_ERROR_DESCRIPTION_SIZE,
+                "%s:%ld: Error: %s near '%s'", file_name,
+                line_number, s, last_token);
+      result_parse = ASN1_SYNTAX_ERROR;
+    }
 
-  return 0;
+  return;
 }
diff --git a/lib/coding.c b/lib/coding.c
index 581ef96..af5c1b7 100644
--- a/lib/coding.c
+++ b/lib/coding.c
@@ -394,7 +394,7 @@ _asn1_complete_explicit_tag (asn1_node node, unsigned char 
*der,
        p = p->right;
       while (p && p != node->down->left)
        {
-         if (type_field (p->type) == TYPE_TAG)
+         if (type_field (p->type) == ASN1_ETYPE_TAG)
            {
              if (p->type & CONST_EXPLICIT)
                {
@@ -429,6 +429,29 @@ _asn1_complete_explicit_tag (asn1_node node, unsigned char 
*der,
   return ASN1_SUCCESS;
 }
 
+tag_and_class_st _asn1_tags[] =
+{
+  [ASN1_ETYPE_GENERALSTRING] = {ASN1_TAG_GENERALSTRING, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_NUMERICSTRING] = {ASN1_TAG_NUMERICSTRING, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_IA5STRING] =     {ASN1_TAG_IA5STRING, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_TELETEXSTRING] = {ASN1_TAG_TELETEXSTRING, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_PRINTABLESTRING] = {ASN1_TAG_PRINTABLESTRING, 
ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_UNIVERSALSTRING] = {ASN1_TAG_UNIVERSALSTRING, 
ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_BMPSTRING] =     {ASN1_TAG_BMPSTRING, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_UTF8STRING] =    {ASN1_TAG_UTF8STRING, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_VISIBLESTRING] = {ASN1_TAG_VISIBLESTRING, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_OCTET_STRING] = {ASN1_TAG_OCTET_STRING, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_BIT_STRING] = {ASN1_TAG_BIT_STRING, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_OBJECT_ID] =  {ASN1_TAG_OBJECT_ID, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_NULL] =       {ASN1_TAG_NULL, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_BOOLEAN] =    {ASN1_TAG_BOOLEAN, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_INTEGER] =    {ASN1_TAG_INTEGER, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_ENUMERATED] = {ASN1_TAG_ENUMERATED, ASN1_CLASS_UNIVERSAL},
+  [ASN1_ETYPE_SEQUENCE] =   {ASN1_TAG_SEQUENCE, ASN1_CLASS_UNIVERSAL | 
ASN1_CLASS_STRUCTURED},
+  [ASN1_ETYPE_SEQUENCE_OF] ={ASN1_TAG_SEQUENCE, ASN1_CLASS_UNIVERSAL | 
ASN1_CLASS_STRUCTURED},
+  [ASN1_ETYPE_SET] =        {ASN1_TAG_SET, ASN1_CLASS_UNIVERSAL | 
ASN1_CLASS_STRUCTURED},
+  [ASN1_ETYPE_SET_OF] =     {ASN1_TAG_SET, ASN1_CLASS_UNIVERSAL | 
ASN1_CLASS_STRUCTURED},
+};
 
 /******************************************************/
 /* Function : _asn1_insert_tag_der                    */
@@ -462,7 +485,7 @@ _asn1_insert_tag_der (asn1_node node, unsigned char *der, 
int *counter,
       p = node->down;
       while (p)
        {
-         if (type_field (p->type) == TYPE_TAG)
+         if (type_field (p->type) == ASN1_ETYPE_TAG)
            {
              if (p->type & CONST_APPLICATION)
                class = ASN1_CLASS_APPLICATION;
@@ -497,10 +520,10 @@ _asn1_insert_tag_der (asn1_node node, unsigned char *der, 
int *counter,
                {               /* CONST_IMPLICIT */
                  if (!is_tag_implicit)
                    {
-                     if ((type_field (node->type) == TYPE_SEQUENCE) ||
-                         (type_field (node->type) == TYPE_SEQUENCE_OF) ||
-                         (type_field (node->type) == TYPE_SET) ||
-                         (type_field (node->type) == TYPE_SET_OF))
+                     if ((type_field (node->type) == ASN1_ETYPE_SEQUENCE) ||
+                         (type_field (node->type) == ASN1_ETYPE_SEQUENCE_OF) ||
+                         (type_field (node->type) == ASN1_ETYPE_SET) ||
+                         (type_field (node->type) == ASN1_ETYPE_SET_OF))
                        class |= ASN1_CLASS_STRUCTURED;
                      class_implicit = class;
                      tag_implicit = _asn1_strtoul (p->value, NULL, 10);
@@ -518,29 +541,10 @@ _asn1_insert_tag_der (asn1_node node, unsigned char *der, 
int *counter,
     }
   else
     {
-      switch (type_field (node->type))
+      unsigned type = type_field (node->type);
+      switch (type)
        {
-       case TYPE_NULL:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_NULL, tag_der,
-                        &tag_len);
-         break;
-       case TYPE_BOOLEAN:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_BOOLEAN, tag_der,
-                        &tag_len);
-         break;
-       case TYPE_INTEGER:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_INTEGER, tag_der,
-                        &tag_len);
-         break;
-       case TYPE_ENUMERATED:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_ENUMERATED, tag_der,
-                        &tag_len);
-         break;
-       case TYPE_OBJECT_ID:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_OBJECT_ID, tag_der,
-                        &tag_len);
-         break;
-       case TYPE_TIME:
+       case ASN1_ETYPE_TIME:
          if (node->type & CONST_UTC)
            {
              _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_UTCTime, tag_der,
@@ -550,35 +554,32 @@ _asn1_insert_tag_der (asn1_node node, unsigned char *der, 
int *counter,
            _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_GENERALIZEDTime,
                           tag_der, &tag_len);
          break;
-       case TYPE_OCTET_STRING:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_OCTET_STRING, tag_der,
-                        &tag_len);
-         break;
-       case TYPE_GENERALSTRING:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_GENERALSTRING,
+       case ASN1_ETYPE_OBJECT_ID:
+       case ASN1_ETYPE_OCTET_STRING:
+       case ASN1_ETYPE_GENERALSTRING:
+       case ASN1_ETYPE_NUMERICSTRING:
+       case ASN1_ETYPE_IA5STRING:
+       case ASN1_ETYPE_TELETEXSTRING:
+       case ASN1_ETYPE_PRINTABLESTRING:
+       case ASN1_ETYPE_UNIVERSALSTRING:
+       case ASN1_ETYPE_BMPSTRING:
+       case ASN1_ETYPE_UTF8STRING:
+       case ASN1_ETYPE_VISIBLESTRING:
+       case ASN1_ETYPE_BIT_STRING:
+       case ASN1_ETYPE_NULL:
+       case ASN1_ETYPE_BOOLEAN:
+       case ASN1_ETYPE_INTEGER:
+       case ASN1_ETYPE_ENUMERATED:
+       case ASN1_ETYPE_SEQUENCE:
+       case ASN1_ETYPE_SEQUENCE_OF:
+       case ASN1_ETYPE_SET:
+       case ASN1_ETYPE_SET_OF:
+         _asn1_tag_der (_asn1_tags[type].class, _asn1_tags[type].tag,
                         tag_der, &tag_len);
          break;
-       case TYPE_BIT_STRING:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_BIT_STRING, tag_der,
-                        &tag_len);
-         break;
-       case TYPE_SEQUENCE:
-       case TYPE_SEQUENCE_OF:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED,
-                        ASN1_TAG_SEQUENCE, tag_der, &tag_len);
-         break;
-       case TYPE_SET:
-       case TYPE_SET_OF:
-         _asn1_tag_der (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED,
-                        ASN1_TAG_SET, tag_der, &tag_len);
-         break;
-       case TYPE_TAG:
-         tag_len = 0;
-         break;
-       case TYPE_CHOICE:
-         tag_len = 0;
-         break;
-       case TYPE_ANY:
+       case ASN1_ETYPE_TAG:
+       case ASN1_ETYPE_CHOICE:
+       case ASN1_ETYPE_ANY:
          tag_len = 0;
          break;
        default:
@@ -624,12 +625,12 @@ _asn1_ordering_set (unsigned char *der, int der_len, 
asn1_node node)
 
   counter = 0;
 
-  if (type_field (node->type) != TYPE_SET)
+  if (type_field (node->type) != ASN1_ETYPE_SET)
     return;
 
   p = node->down;
-  while ((type_field (p->type) == TYPE_TAG)
-        || (type_field (p->type) == TYPE_SIZE))
+  while ((type_field (p->type) == ASN1_ETYPE_TAG)
+        || (type_field (p->type) == ASN1_ETYPE_SIZE))
     p = p->right;
 
   if ((p == NULL) || (p->right == NULL))
@@ -737,12 +738,12 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, 
asn1_node node)
 
   counter = 0;
 
-  if (type_field (node->type) != TYPE_SET_OF)
+  if (type_field (node->type) != ASN1_ETYPE_SET_OF)
     return;
 
   p = node->down;
-  while ((type_field (p->type) == TYPE_TAG)
-        || (type_field (p->type) == TYPE_SIZE))
+  while ((type_field (p->type) == ASN1_ETYPE_TAG)
+        || (type_field (p->type) == ASN1_ETYPE_SIZE))
     p = p->right;
   p = p->right;
 
@@ -906,14 +907,14 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
        }
       switch (type_field (p->type))
        {
-       case TYPE_NULL:
+       case ASN1_ETYPE_NULL:
          max_len--;
          if (max_len >= 0)
            der[counter] = 0;
          counter++;
          move = RIGHT;
          break;
-       case TYPE_BOOLEAN:
+       case ASN1_ETYPE_BOOLEAN:
          if ((p->type & CONST_DEFAULT) && (p->value == NULL))
            {
              counter = counter_old;
@@ -942,8 +943,8 @@ asn1_der_coding (asn1_node element, const char *name, void 
*ider, int *len,
            }
          move = RIGHT;
          break;
-       case TYPE_INTEGER:
-       case TYPE_ENUMERATED:
+       case ASN1_ETYPE_INTEGER:
+       case ASN1_ETYPE_ENUMERATED:
          if ((p->type & CONST_DEFAULT) && (p->value == NULL))
            {
              counter = counter_old;
@@ -971,7 +972,7 @@ asn1_der_coding (asn1_node element, const char *name, void 
*ider, int *len,
            }
          move = RIGHT;
          break;
-       case TYPE_OBJECT_ID:
+       case ASN1_ETYPE_OBJECT_ID:
          if ((p->type & CONST_DEFAULT) && (p->value == NULL))
            {
              counter = counter_old;
@@ -996,7 +997,7 @@ asn1_der_coding (asn1_node element, const char *name, void 
*ider, int *len,
            }
          move = RIGHT;
          break;
-       case TYPE_TIME:
+       case ASN1_ETYPE_TIME:
          if (p->value == NULL)
            {
              _asn1_error_description_value_not_found (p, ErrorDescription);
@@ -1012,45 +1013,17 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
          counter += len2;
          move = RIGHT;
          break;
-       case TYPE_OCTET_STRING:
-         if (p->value == NULL)
-           {
-             _asn1_error_description_value_not_found (p, ErrorDescription);
-             err = ASN1_VALUE_NOT_FOUND;
-             goto error;
-           }
-         len2 = asn1_get_length_der (p->value, p->value_len, &len3);
-         if (len2 < 0)
-           {
-             err = ASN1_DER_ERROR;
-             goto error;
-           }
-         max_len -= len2 + len3;
-         if (max_len >= 0)
-           memcpy (der + counter, p->value, len3 + len2);
-         counter += len3 + len2;
-         move = RIGHT;
-         break;
-       case TYPE_GENERALSTRING:
-         if (p->value == NULL)
-           {
-             _asn1_error_description_value_not_found (p, ErrorDescription);
-             err = ASN1_VALUE_NOT_FOUND;
-             goto error;
-           }
-         len2 = asn1_get_length_der (p->value, p->value_len, &len3);
-         if (len2 < 0)
-           {
-             err = ASN1_DER_ERROR;
-             goto error;
-           }
-         max_len -= len2 + len3;
-         if (max_len >= 0)
-           memcpy (der + counter, p->value, len3 + len2);
-         counter += len3 + len2;
-         move = RIGHT;
-         break;
-       case TYPE_BIT_STRING:
+       case ASN1_ETYPE_OCTET_STRING:
+       case ASN1_ETYPE_GENERALSTRING:
+       case ASN1_ETYPE_NUMERICSTRING:
+       case ASN1_ETYPE_IA5STRING:
+       case ASN1_ETYPE_TELETEXSTRING:
+       case ASN1_ETYPE_PRINTABLESTRING:
+       case ASN1_ETYPE_UNIVERSALSTRING:
+       case ASN1_ETYPE_BMPSTRING:
+       case ASN1_ETYPE_UTF8STRING:
+       case ASN1_ETYPE_VISIBLESTRING:
+       case ASN1_ETYPE_BIT_STRING:
          if (p->value == NULL)
            {
              _asn1_error_description_value_not_found (p, ErrorDescription);
@@ -1069,8 +1042,8 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
          counter += len3 + len2;
          move = RIGHT;
          break;
-       case TYPE_SEQUENCE:
-       case TYPE_SET:
+       case ASN1_ETYPE_SEQUENCE:
+       case ASN1_ETYPE_SET:
          if (move != UP)
            {
              _asn1_ltostr (counter, (char *) temp);
@@ -1085,7 +1058,7 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
              else
                {
                  p2 = p->down;
-                 while (p2 && (type_field (p2->type) == TYPE_TAG))
+                 while (p2 && (type_field (p2->type) == ASN1_ETYPE_TAG))
                    p2 = p2->right;
                  if (p2)
                    {
@@ -1101,7 +1074,7 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
            {                   /* move==UP */
              len2 = _asn1_strtol (p->value, NULL, 10);
              _asn1_set_value (p, NULL, 0);
-             if ((type_field (p->type) == TYPE_SET) && (max_len >= 0))
+             if ((type_field (p->type) == ASN1_ETYPE_SET) && (max_len >= 0))
                _asn1_ordering_set (der + len2, max_len - len2, p);
              asn1_length_der (counter - len2, temp, &len3);
              max_len -= len3;
@@ -1114,8 +1087,8 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
              move = RIGHT;
            }
          break;
-       case TYPE_SEQUENCE_OF:
-       case TYPE_SET_OF:
+       case ASN1_ETYPE_SEQUENCE_OF:
+       case ASN1_ETYPE_SET_OF:
          if (move != UP)
            {
              _asn1_ltostr (counter, (char *) temp);
@@ -1124,8 +1097,8 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
              if (tlen > 0)
                _asn1_set_value (p, temp, tlen + 1);
              p = p->down;
-             while ((type_field (p->type) == TYPE_TAG)
-                    || (type_field (p->type) == TYPE_SIZE))
+             while ((type_field (p->type) == ASN1_ETYPE_TAG)
+                    || (type_field (p->type) == ASN1_ETYPE_SIZE))
                p = p->right;
              if (p->right)
                {
@@ -1141,7 +1114,7 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
            {
              len2 = _asn1_strtol (p->value, NULL, 10);
              _asn1_set_value (p, NULL, 0);
-             if ((type_field (p->type) == TYPE_SET_OF)
+             if ((type_field (p->type) == ASN1_ETYPE_SET_OF)
                  && (max_len - len2 > 0))
                {
                  _asn1_ordering_set_of (der + len2, max_len - len2, p);
@@ -1157,7 +1130,7 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
              move = RIGHT;
            }
          break;
-       case TYPE_ANY:
+       case ASN1_ETYPE_ANY:
          if (p->value == NULL)
            {
              _asn1_error_description_value_not_found (p, ErrorDescription);
diff --git a/lib/decoding.c b/lib/decoding.c
index 79766a1..5a844b8 100644
--- a/lib/decoding.c
+++ b/lib/decoding.c
@@ -387,7 +387,7 @@ _asn1_extract_tag_der (asn1_node node, const unsigned char 
*der, int der_len,
       p = node->down;
       while (p)
        {
-         if (type_field (p->type) == TYPE_TAG)
+         if (type_field (p->type) == ASN1_ETYPE_TAG)
            {
              if (p->type & CONST_APPLICATION)
                class2 = ASN1_CLASS_APPLICATION;
@@ -436,10 +436,10 @@ _asn1_extract_tag_der (asn1_node node, const unsigned 
char *der, int der_len,
                {               /* ASN1_TAG_IMPLICIT */
                  if (!is_tag_implicit)
                    {
-                     if ((type_field (node->type) == TYPE_SEQUENCE) ||
-                         (type_field (node->type) == TYPE_SEQUENCE_OF) ||
-                         (type_field (node->type) == TYPE_SET) ||
-                         (type_field (node->type) == TYPE_SET_OF))
+                     if ((type_field (node->type) == ASN1_ETYPE_SEQUENCE) ||
+                         (type_field (node->type) == ASN1_ETYPE_SEQUENCE_OF) ||
+                         (type_field (node->type) == ASN1_ETYPE_SET) ||
+                         (type_field (node->type) == ASN1_ETYPE_SET_OF))
                        class2 |= ASN1_CLASS_STRUCTURED;
                      class_implicit = class2;
                      tag_implicit = strtoul ((char *) p->value, NULL, 10);
@@ -462,7 +462,7 @@ _asn1_extract_tag_der (asn1_node node, const unsigned char 
*der, int der_len,
 
       if ((class != class_implicit) || (tag != tag_implicit))
        {
-         if (type_field (node->type) == TYPE_OCTET_STRING)
+         if (type_field (node->type) == ASN1_ETYPE_OCTET_STRING)
            {
              class_implicit |= ASN1_CLASS_STRUCTURED;
              if ((class != class_implicit) || (tag != tag_implicit))
@@ -474,7 +474,8 @@ _asn1_extract_tag_der (asn1_node node, const unsigned char 
*der, int der_len,
     }
   else
     {
-      if (type_field (node->type) == TYPE_TAG)
+      unsigned type = type_field (node->type);
+      if (type == ASN1_ETYPE_TAG)
        {
          counter = 0;
          *ret_len = counter;
@@ -489,29 +490,32 @@ _asn1_extract_tag_der (asn1_node node, const unsigned 
char *der, int der_len,
       if (counter + len2 > der_len)
        return ASN1_DER_ERROR;
 
-      switch (type_field (node->type))
+      switch (type)
        {
-       case TYPE_NULL:
-         if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_NULL))
+       case ASN1_ETYPE_NULL:
+       case ASN1_ETYPE_BOOLEAN:
+       case ASN1_ETYPE_INTEGER:
+       case ASN1_ETYPE_ENUMERATED:
+       case ASN1_ETYPE_OBJECT_ID:
+       case ASN1_ETYPE_GENERALSTRING:
+       case ASN1_ETYPE_NUMERICSTRING:
+       case ASN1_ETYPE_IA5STRING:
+       case ASN1_ETYPE_TELETEXSTRING:
+       case ASN1_ETYPE_PRINTABLESTRING:
+       case ASN1_ETYPE_UNIVERSALSTRING:
+       case ASN1_ETYPE_BMPSTRING:
+       case ASN1_ETYPE_UTF8STRING:
+       case ASN1_ETYPE_VISIBLESTRING:
+       case ASN1_ETYPE_BIT_STRING:
+       case ASN1_ETYPE_SEQUENCE:
+       case ASN1_ETYPE_SEQUENCE_OF:
+       case ASN1_ETYPE_SET:
+       case ASN1_ETYPE_SET_OF:
+         if ((class != _asn1_tags[type].class) || (tag != 
_asn1_tags[type].tag))
            return ASN1_DER_ERROR;
          break;
-       case TYPE_BOOLEAN:
-         if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_BOOLEAN))
-           return ASN1_DER_ERROR;
-         break;
-       case TYPE_INTEGER:
-         if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_INTEGER))
-           return ASN1_DER_ERROR;
-         break;
-       case TYPE_ENUMERATED:
-         if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_ENUMERATED))
-           return ASN1_DER_ERROR;
-         break;
-       case TYPE_OBJECT_ID:
-         if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_OBJECT_ID))
-           return ASN1_DER_ERROR;
-         break;
-       case TYPE_TIME:
+
+       case ASN1_ETYPE_TIME:
          if (node->type & CONST_UTC)
            {
              if ((class != ASN1_CLASS_UNIVERSAL)
@@ -525,34 +529,15 @@ _asn1_extract_tag_der (asn1_node node, const unsigned 
char *der, int der_len,
                return ASN1_DER_ERROR;
            }
          break;
-       case TYPE_OCTET_STRING:
+
+       case ASN1_ETYPE_OCTET_STRING:
+         /* does it need to be structured??? --nmav */
          if (((class != ASN1_CLASS_UNIVERSAL)
               && (class != (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED)))
              || (tag != ASN1_TAG_OCTET_STRING))
            return ASN1_DER_ERROR;
          break;
-       case TYPE_GENERALSTRING:
-         if ((class != ASN1_CLASS_UNIVERSAL)
-             || (tag != ASN1_TAG_GENERALSTRING))
-           return ASN1_DER_ERROR;
-         break;
-       case TYPE_BIT_STRING:
-         if ((class != ASN1_CLASS_UNIVERSAL) || (tag != ASN1_TAG_BIT_STRING))
-           return ASN1_DER_ERROR;
-         break;
-       case TYPE_SEQUENCE:
-       case TYPE_SEQUENCE_OF:
-         if ((class != (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED))
-             || (tag != ASN1_TAG_SEQUENCE))
-           return ASN1_DER_ERROR;
-         break;
-       case TYPE_SET:
-       case TYPE_SET_OF:
-         if ((class != (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED))
-             || (tag != ASN1_TAG_SET))
-           return ASN1_DER_ERROR;
-         break;
-       case TYPE_ANY:
+       case ASN1_ETYPE_ANY:
          counter -= len2;
          break;
        default:
@@ -883,7 +868,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
                {
                  if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
                    {
-                     if (type_field (p2->type) != TYPE_CHOICE)
+                     if (type_field (p2->type) != ASN1_ETYPE_CHOICE)
                        ris =
                          _asn1_extract_tag_der (p2, der + counter,
                                                 len - counter, &len2);
@@ -938,7 +923,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
                }
            }
 
-         if (type_field (p->type) == TYPE_CHOICE)
+         if (type_field (p->type) == ASN1_ETYPE_CHOICE)
            {
              while (p->down)
                {
@@ -1021,7 +1006,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
        {
          switch (type_field (p->type))
            {
-           case TYPE_NULL:
+           case ASN1_ETYPE_NULL:
              if (der[counter])
                {
                  result = ASN1_DER_ERROR;
@@ -1030,7 +1015,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
              counter++;
              move = RIGHT;
              break;
-           case TYPE_BOOLEAN:
+           case ASN1_ETYPE_BOOLEAN:
              if (der[counter++] != 1)
                {
                  result = ASN1_DER_ERROR;
@@ -1042,8 +1027,8 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
                _asn1_set_value (p, "T", 1);
              move = RIGHT;
              break;
-           case TYPE_INTEGER:
-           case TYPE_ENUMERATED:
+           case ASN1_ETYPE_INTEGER:
+           case ASN1_ETYPE_ENUMERATED:
              len2 =
                asn1_get_length_der (der + counter, len - counter, &len3);
              if (len2 < 0)
@@ -1056,7 +1041,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
              counter += len3 + len2;
              move = RIGHT;
              break;
-           case TYPE_OBJECT_ID:
+           case ASN1_ETYPE_OBJECT_ID:
              result =
                _asn1_get_objectid_der (der + counter, len - counter, &len2,
                                        temp, sizeof (temp));
@@ -1069,7 +1054,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
              counter += len2;
              move = RIGHT;
              break;
-           case TYPE_TIME:
+           case ASN1_ETYPE_TIME:
              result =
                _asn1_get_time_der (der + counter, len - counter, &len2, temp,
                                    sizeof (temp) - 1);
@@ -1082,7 +1067,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
              counter += len2;
              move = RIGHT;
              break;
-           case TYPE_OCTET_STRING:
+           case ASN1_ETYPE_OCTET_STRING:
              len3 = len - counter;
              result = _asn1_get_octet_string (der + counter, p, &len3);
              if (result != ASN1_SUCCESS)
@@ -1091,7 +1076,16 @@ asn1_der_decoding (asn1_node * element, const void 
*ider, int len,
              counter += len3;
              move = RIGHT;
              break;
-           case TYPE_GENERALSTRING:
+           case ASN1_ETYPE_GENERALSTRING:
+            case ASN1_ETYPE_NUMERICSTRING:
+            case ASN1_ETYPE_IA5STRING:
+            case ASN1_ETYPE_TELETEXSTRING:
+            case ASN1_ETYPE_PRINTABLESTRING:
+            case ASN1_ETYPE_UNIVERSALSTRING:
+            case ASN1_ETYPE_BMPSTRING:
+            case ASN1_ETYPE_UTF8STRING:
+            case ASN1_ETYPE_VISIBLESTRING:
+           case ASN1_ETYPE_BIT_STRING:
              len2 =
                asn1_get_length_der (der + counter, len - counter, &len3);
              if (len2 < 0)
@@ -1104,21 +1098,8 @@ asn1_der_decoding (asn1_node * element, const void 
*ider, int len,
              counter += len3 + len2;
              move = RIGHT;
              break;
-           case TYPE_BIT_STRING:
-             len2 =
-               asn1_get_length_der (der + counter, len - counter, &len3);
-             if (len2 < 0)
-               {
-                 result = ASN1_DER_ERROR;
-                 goto cleanup;
-               }
-
-             _asn1_set_value (p, der + counter, len3 + len2);
-             counter += len3 + len2;
-             move = RIGHT;
-             break;
-           case TYPE_SEQUENCE:
-           case TYPE_SET:
+           case ASN1_ETYPE_SEQUENCE:
+           case ASN1_ETYPE_SET:
              if (move == UP)
                {
                  len2 = _asn1_strtol (p->value, NULL, 10);
@@ -1173,7 +1154,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
                      p2 = p->down;
                      while (p2)
                        {
-                         if (type_field (p2->type) != TYPE_TAG)
+                         if (type_field (p2->type) != ASN1_ETYPE_TAG)
                            {
                              p3 = p2->right;
                              asn1_delete_structure (&p2);
@@ -1191,8 +1172,8 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
                    }
                }
              break;
-           case TYPE_SEQUENCE_OF:
-           case TYPE_SET_OF:
+           case ASN1_ETYPE_SEQUENCE_OF:
+           case ASN1_ETYPE_SET_OF:
              if (move == UP)
                {
                  len2 = _asn1_strtol (p->value, NULL, 10);
@@ -1260,8 +1241,8 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
                          _asn1_set_value (p, "-1", 3);
                        }
                      p2 = p->down;
-                     while ((type_field (p2->type) == TYPE_TAG)
-                            || (type_field (p2->type) == TYPE_SIZE))
+                     while ((type_field (p2->type) == ASN1_ETYPE_TAG)
+                            || (type_field (p2->type) == ASN1_ETYPE_SIZE))
                        p2 = p2->right;
                      if (p2->right == NULL)
                        _asn1_append_sequence_set (p);
@@ -1270,7 +1251,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
                }
              move = RIGHT;
              break;
-           case TYPE_ANY:
+           case ASN1_ETYPE_ANY:
              if (asn1_get_tag_der
                  (der + counter, len - counter, &class, &len2,
                   &tag) != ASN1_SUCCESS)
@@ -1494,7 +1475,7 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
                {
                  if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
                    {
-                     if (type_field (p2->type) != TYPE_CHOICE)
+                     if (type_field (p2->type) != ASN1_ETYPE_CHOICE)
                        ris =
                          _asn1_extract_tag_der (p2, der + counter,
                                                 len - counter, &len2);
@@ -1549,7 +1530,7 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
                }
            }
 
-         if (type_field (p->type) == TYPE_CHOICE)
+         if (type_field (p->type) == ASN1_ETYPE_CHOICE)
            {
              while (p->down)
                {
@@ -1632,7 +1613,7 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
        {
          switch (type_field (p->type))
            {
-           case TYPE_NULL:
+           case ASN1_ETYPE_NULL:
              if (der[counter])
                {
                  result = ASN1_DER_ERROR;
@@ -1645,7 +1626,7 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
              counter++;
              move = RIGHT;
              break;
-           case TYPE_BOOLEAN:
+           case ASN1_ETYPE_BOOLEAN:
              if (der[counter++] != 1)
                {
                  result = ASN1_DER_ERROR;
@@ -1668,8 +1649,8 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
 
              move = RIGHT;
              break;
-           case TYPE_INTEGER:
-           case TYPE_ENUMERATED:
+           case ASN1_ETYPE_INTEGER:
+           case ASN1_ETYPE_ENUMERATED:
              len2 =
                asn1_get_length_der (der + counter, len - counter, &len3);
              if (len2 < 0)
@@ -1693,7 +1674,7 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
              counter += len3 + len2;
              move = RIGHT;
              break;
-           case TYPE_OBJECT_ID:
+           case ASN1_ETYPE_OBJECT_ID:
              if (state == FOUND)
                {
                  result =
@@ -1725,7 +1706,7 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
              counter += len2;
              move = RIGHT;
              break;
-           case TYPE_TIME:
+           case ASN1_ETYPE_TIME:
              if (state == FOUND)
                {
                  result =
@@ -1756,7 +1737,7 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
              counter += len2;
              move = RIGHT;
              break;
-           case TYPE_OCTET_STRING:
+           case ASN1_ETYPE_OCTET_STRING:
              len3 = len - counter;
              if (state == FOUND)
                {
@@ -1773,7 +1754,16 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
              counter += len3;
              move = RIGHT;
              break;
-           case TYPE_GENERALSTRING:
+           case ASN1_ETYPE_GENERALSTRING:
+            case ASN1_ETYPE_NUMERICSTRING:
+            case ASN1_ETYPE_IA5STRING:
+            case ASN1_ETYPE_TELETEXSTRING:
+            case ASN1_ETYPE_PRINTABLESTRING:
+            case ASN1_ETYPE_UNIVERSALSTRING:
+            case ASN1_ETYPE_BMPSTRING:
+            case ASN1_ETYPE_UTF8STRING:
+            case ASN1_ETYPE_VISIBLESTRING:
+           case ASN1_ETYPE_BIT_STRING:
              len2 =
                asn1_get_length_der (der + counter, len - counter, &len3);
              if (len2 < 0)
@@ -1797,31 +1787,8 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
              counter += len3 + len2;
              move = RIGHT;
              break;
-           case TYPE_BIT_STRING:
-             len2 =
-               asn1_get_length_der (der + counter, len - counter, &len3);
-             if (len2 < 0)
-               {
-                 result = ASN1_DER_ERROR;
-                 goto cleanup;
-               }
-             if (state == FOUND)
-               {
-                 if (len3 + len2 > len - counter)
-                   {
-                     result = ASN1_DER_ERROR;
-                     goto cleanup;
-                   }
-                 _asn1_set_value (p, der + counter, len3 + len2);
-
-                 if (p == nodeFound)
-                   state = EXIT;
-               }
-             counter += len3 + len2;
-             move = RIGHT;
-             break;
-           case TYPE_SEQUENCE:
-           case TYPE_SET:
+           case ASN1_ETYPE_SEQUENCE:
+           case ASN1_ETYPE_SET:
              if (move == UP)
                {
                  len2 = _asn1_strtol (p->value, NULL, 10);
@@ -1887,7 +1854,7 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
                          p2 = p->down;
                          while (p2)
                            {
-                             if (type_field (p2->type) != TYPE_TAG)
+                             if (type_field (p2->type) != ASN1_ETYPE_TAG)
                                {
                                  p3 = p2->right;
                                  asn1_delete_structure (&p2);
@@ -1906,8 +1873,8 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
                    }
                }
              break;
-           case TYPE_SEQUENCE_OF:
-           case TYPE_SET_OF:
+           case ASN1_ETYPE_SEQUENCE_OF:
+           case ASN1_ETYPE_SET_OF:
              if (move == UP)
                {
                  len2 = _asn1_strtol (p->value, NULL, 10);
@@ -1964,8 +1931,8 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
                          if (tlen > 0)
                            _asn1_set_value (p, temp, tlen + 1);
                          p2 = p->down;
-                         while ((type_field (p2->type) == TYPE_TAG)
-                                || (type_field (p2->type) == TYPE_SIZE))
+                         while ((type_field (p2->type) == ASN1_ETYPE_TAG)
+                                || (type_field (p2->type) == ASN1_ETYPE_SIZE))
                            p2 = p2->right;
                          if (p2->right == NULL)
                            _asn1_append_sequence_set (p);
@@ -1976,7 +1943,7 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
                }
 
              break;
-           case TYPE_ANY:
+           case ASN1_ETYPE_ANY:
              if (asn1_get_tag_der
                  (der + counter, len - counter, &class, &len2,
                   &tag) != ASN1_SUCCESS)
@@ -2289,7 +2256,7 @@ asn1_der_decoding_startEnd (asn1_node element, const void 
*ider, int len,
                {
                  if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
                    {           /* CONTROLLARE */
-                     if (type_field (p2->type) != TYPE_CHOICE)
+                     if (type_field (p2->type) != ASN1_ETYPE_CHOICE)
                        ris =
                          _asn1_extract_tag_der (p2, der + counter,
                                                 len - counter, &len2);
@@ -2319,7 +2286,7 @@ asn1_der_decoding_startEnd (asn1_node element, const void 
*ider, int len,
          if (p == node_to_find)
            *start = counter;
 
-         if (type_field (p->type) == TYPE_CHOICE)
+         if (type_field (p->type) == ASN1_ETYPE_CHOICE)
            {
              p = p->down;
               if (p == NULL)
@@ -2359,44 +2326,19 @@ asn1_der_decoding_startEnd (asn1_node element, const 
void *ider, int len,
        {
          switch (type_field (p->type))
            {
-           case TYPE_NULL:
+           case ASN1_ETYPE_NULL:
              if (der[counter])
                return ASN1_DER_ERROR;
              counter++;
              move = RIGHT;
              break;
-           case TYPE_BOOLEAN:
+           case ASN1_ETYPE_BOOLEAN:
              if (der[counter++] != 1)
                return ASN1_DER_ERROR;
              counter++;
              move = RIGHT;
              break;
-           case TYPE_INTEGER:
-           case TYPE_ENUMERATED:
-             len2 =
-               asn1_get_length_der (der + counter, len - counter, &len3);
-             if (len2 < 0)
-               return ASN1_DER_ERROR;
-             counter += len3 + len2;
-             move = RIGHT;
-             break;
-           case TYPE_OBJECT_ID:
-             len2 =
-               asn1_get_length_der (der + counter, len - counter, &len3);
-             if (len2 < 0)
-               return ASN1_DER_ERROR;
-             counter += len2 + len3;
-             move = RIGHT;
-             break;
-           case TYPE_TIME:
-             len2 =
-               asn1_get_length_der (der + counter, len - counter, &len3);
-             if (len2 < 0)
-               return ASN1_DER_ERROR;
-             counter += len2 + len3;
-             move = RIGHT;
-             break;
-           case TYPE_OCTET_STRING:
+           case ASN1_ETYPE_OCTET_STRING:
              len3 = len - counter;
              ris = _asn1_get_octet_string (der + counter, NULL, &len3);
              if (ris != ASN1_SUCCESS)
@@ -2404,15 +2346,20 @@ asn1_der_decoding_startEnd (asn1_node element, const 
void *ider, int len,
              counter += len3;
              move = RIGHT;
              break;
-           case TYPE_GENERALSTRING:
-             len2 =
-               asn1_get_length_der (der + counter, len - counter, &len3);
-             if (len2 < 0)
-               return ASN1_DER_ERROR;
-             counter += len3 + len2;
-             move = RIGHT;
-             break;
-           case TYPE_BIT_STRING:
+           case ASN1_ETYPE_TIME:
+           case ASN1_ETYPE_OBJECT_ID:
+           case ASN1_ETYPE_INTEGER:
+           case ASN1_ETYPE_ENUMERATED:
+           case ASN1_ETYPE_GENERALSTRING:
+            case ASN1_ETYPE_NUMERICSTRING:
+            case ASN1_ETYPE_IA5STRING:
+            case ASN1_ETYPE_TELETEXSTRING:
+            case ASN1_ETYPE_PRINTABLESTRING:
+            case ASN1_ETYPE_UNIVERSALSTRING:
+            case ASN1_ETYPE_BMPSTRING:
+            case ASN1_ETYPE_UTF8STRING:
+            case ASN1_ETYPE_VISIBLESTRING:
+           case ASN1_ETYPE_BIT_STRING:
              len2 =
                asn1_get_length_der (der + counter, len - counter, &len3);
              if (len2 < 0)
@@ -2420,8 +2367,8 @@ asn1_der_decoding_startEnd (asn1_node element, const void 
*ider, int len,
              counter += len3 + len2;
              move = RIGHT;
              break;
-           case TYPE_SEQUENCE:
-           case TYPE_SET:
+           case ASN1_ETYPE_SEQUENCE:
+           case ASN1_ETYPE_SET:
              if (move != UP)
                {
                  len3 =
@@ -2441,8 +2388,8 @@ asn1_der_decoding_startEnd (asn1_node element, const void 
*ider, int len,
                  move = RIGHT;
                }
              break;
-           case TYPE_SEQUENCE_OF:
-           case TYPE_SET_OF:
+           case ASN1_ETYPE_SEQUENCE_OF:
+           case ASN1_ETYPE_SET_OF:
              if (move != UP)
                {
                  len3 =
@@ -2455,8 +2402,8 @@ asn1_der_decoding_startEnd (asn1_node element, const void 
*ider, int len,
                  else if (len3)
                    {
                      p2 = p->down;
-                     while ((type_field (p2->type) == TYPE_TAG) ||
-                            (type_field (p2->type) == TYPE_SIZE))
+                     while ((type_field (p2->type) == ASN1_ETYPE_TAG) ||
+                            (type_field (p2->type) == ASN1_ETYPE_SIZE))
                        p2 = p2->right;
                      p = p2;
                    }
@@ -2468,7 +2415,7 @@ asn1_der_decoding_startEnd (asn1_node element, const void 
*ider, int len,
                }
              move = RIGHT;
              break;
-           case TYPE_ANY:
+           case ASN1_ETYPE_ANY:
              if (asn1_get_tag_der
                  (der + counter, len - counter, &class, &len2,
                   &tag) != ASN1_SUCCESS)
@@ -2587,12 +2534,12 @@ asn1_expand_any_defined_by (asn1_node definitions, 
asn1_node * element)
 
       switch (type_field (p->type))
        {
-       case TYPE_ANY:
+       case ASN1_ETYPE_ANY:
          if ((p->type & CONST_DEFINED_BY) && (p->value))
            {
              /* search the "DEF_BY" element */
              p2 = p->down;
-             while ((p2) && (type_field (p2->type) != TYPE_CONSTANT))
+             while ((p2) && (type_field (p2->type) != ASN1_ETYPE_CONSTANT))
                p2 = p2->right;
 
              if (!p2)
@@ -2617,7 +2564,7 @@ asn1_expand_any_defined_by (asn1_node definitions, 
asn1_node * element)
                  p3 = p3->right;
                }
 
-             if ((!p3) || (type_field (p3->type) != TYPE_OBJECT_ID) ||
+             if ((!p3) || (type_field (p3->type) != ASN1_ETYPE_OBJECT_ID) ||
                  (p3->value == NULL))
                {
 
@@ -2639,7 +2586,7 @@ asn1_expand_any_defined_by (asn1_node definitions, 
asn1_node * element)
                      p3 = p3->right;
                    }
 
-                 if ((!p3) || (type_field (p3->type) != TYPE_OBJECT_ID) ||
+                 if ((!p3) || (type_field (p3->type) != ASN1_ETYPE_OBJECT_ID) 
||
                      (p3->value == NULL))
                    {
                      retCode = ASN1_ERROR_TYPE_ANY;
@@ -2651,7 +2598,7 @@ asn1_expand_any_defined_by (asn1_node definitions, 
asn1_node * element)
              p2 = definitions->down;
              while (p2)
                {
-                 if ((type_field (p2->type) == TYPE_OBJECT_ID) &&
+                 if ((type_field (p2->type) == ASN1_ETYPE_OBJECT_ID) &&
                      (p2->type & CONST_ASSIGN))
                    {
                      strcpy (name, definitionsName);
@@ -2812,7 +2759,7 @@ asn1_expand_octet_string (asn1_node definitions, 
asn1_node * element,
   octetNode = asn1_find_node (*element, octetName);
   if (octetNode == NULL)
     return ASN1_ELEMENT_NOT_FOUND;
-  if (type_field (octetNode->type) != TYPE_OCTET_STRING)
+  if (type_field (octetNode->type) != ASN1_ETYPE_OCTET_STRING)
     return ASN1_ELEMENT_NOT_FOUND;
   if (octetNode->value == NULL)
     return ASN1_VALUE_NOT_FOUND;
@@ -2821,7 +2768,7 @@ asn1_expand_octet_string (asn1_node definitions, 
asn1_node * element,
   if (objectNode == NULL)
     return ASN1_ELEMENT_NOT_FOUND;
 
-  if (type_field (objectNode->type) != TYPE_OBJECT_ID)
+  if (type_field (objectNode->type) != ASN1_ETYPE_OBJECT_ID)
     return ASN1_ELEMENT_NOT_FOUND;
 
   if (objectNode->value == NULL)
@@ -2832,7 +2779,7 @@ asn1_expand_octet_string (asn1_node definitions, 
asn1_node * element,
   p2 = definitions->down;
   while (p2)
     {
-      if ((type_field (p2->type) == TYPE_OBJECT_ID) &&
+      if ((type_field (p2->type) == ASN1_ETYPE_OBJECT_ID) &&
          (p2->type & CONST_ASSIGN))
        {
          strcpy (name, definitions->name);
diff --git a/lib/element.c b/lib/element.c
index 4c871a1..2c6a2fd 100644
--- a/lib/element.c
+++ b/lib/element.c
@@ -137,8 +137,8 @@ _asn1_append_sequence_set (asn1_node node)
     return ASN1_GENERIC_ERROR;
 
   p = node->down;
-  while ((type_field (p->type) == TYPE_TAG)
-        || (type_field (p->type) == TYPE_SIZE))
+  while ((type_field (p->type) == ASN1_ETYPE_TAG)
+        || (type_field (p->type) == ASN1_ETYPE_SIZE))
     p = p->right;
   p2 = _asn1_copy_structure3 (p);
   while (p->right)
@@ -287,12 +287,12 @@ asn1_write_value (asn1_node node_root, const char *name,
       return ASN1_SUCCESS;
     }
 
-  if ((type_field (node->type) == TYPE_SEQUENCE_OF) && (value == NULL)
+  if ((type_field (node->type) == ASN1_ETYPE_SEQUENCE_OF) && (value == NULL)
       && (len == 0))
     {
       p = node->down;
-      while ((type_field (p->type) == TYPE_TAG)
-            || (type_field (p->type) == TYPE_SIZE))
+      while ((type_field (p->type) == ASN1_ETYPE_TAG)
+            || (type_field (p->type) == ASN1_ETYPE_SIZE))
        p = p->right;
 
       while (p->right)
@@ -303,13 +303,13 @@ asn1_write_value (asn1_node node_root, const char *name,
 
   switch (type_field (node->type))
     {
-    case TYPE_BOOLEAN:
+    case ASN1_ETYPE_BOOLEAN:
       if (!_asn1_strcmp (value, "TRUE"))
        {
          if (node->type & CONST_DEFAULT)
            {
              p = node->down;
-             while (type_field (p->type) != TYPE_DEFAULT)
+             while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
                p = p->right;
              if (p->type & CONST_TRUE)
                _asn1_set_value (node, NULL, 0);
@@ -324,7 +324,7 @@ asn1_write_value (asn1_node node_root, const char *name,
          if (node->type & CONST_DEFAULT)
            {
              p = node->down;
-             while (type_field (p->type) != TYPE_DEFAULT)
+             while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
                p = p->right;
              if (p->type & CONST_FALSE)
                _asn1_set_value (node, NULL, 0);
@@ -337,8 +337,8 @@ asn1_write_value (asn1_node node_root, const char *name,
       else
        return ASN1_VALUE_NOT_VALID;
       break;
-    case TYPE_INTEGER:
-    case TYPE_ENUMERATED:
+    case ASN1_ETYPE_INTEGER:
+    case ASN1_ETYPE_ENUMERATED:
       if (len == 0)
        {
          if ((isdigit (value[0])) || (value[0] == '-'))
@@ -357,7 +357,7 @@ asn1_write_value (asn1_node node_root, const char *name,
              p = node->down;
              while (p)
                {
-                 if (type_field (p->type) == TYPE_CONSTANT)
+                 if (type_field (p->type) == ASN1_ETYPE_CONSTANT)
                    {
                      if (!_asn1_strcmp (p->name, value))
                        {
@@ -392,7 +392,7 @@ asn1_write_value (asn1_node node_root, const char *name,
       else
        negative = 0;
 
-      if (negative && (type_field (node->type) == TYPE_ENUMERATED))
+      if (negative && (type_field (node->type) == ASN1_ETYPE_ENUMERATED))
        {
          free (value_temp);
          return ASN1_VALUE_NOT_VALID;
@@ -413,7 +413,7 @@ asn1_write_value (asn1_node node_root, const char *name,
       if (node->type & CONST_DEFAULT)
        {
          p = node->down;
-         while (type_field (p->type) != TYPE_DEFAULT)
+         while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
            p = p->right;
          if ((isdigit (p->value[0])) || (p->value[0] == '-'))
            {
@@ -437,7 +437,7 @@ asn1_write_value (asn1_node node_root, const char *name,
              p2 = node->down;
              while (p2)
                {
-                 if (type_field (p2->type) == TYPE_CONSTANT)
+                 if (type_field (p2->type) == ASN1_ETYPE_CONSTANT)
                    {
                      if (!_asn1_strcmp (p2->name, p->value))
                        {
@@ -479,14 +479,14 @@ asn1_write_value (asn1_node node_root, const char *name,
        }
       free (value_temp);
       break;
-    case TYPE_OBJECT_ID:
+    case ASN1_ETYPE_OBJECT_ID:
       for (i = 0; i < _asn1_strlen (value); i++)
        if ((!isdigit (value[i])) && (value[i] != '.') && (value[i] != '+'))
          return ASN1_VALUE_NOT_VALID;
       if (node->type & CONST_DEFAULT)
        {
          p = node->down;
-         while (type_field (p->type) != TYPE_DEFAULT)
+         while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
            p = p->right;
          if (!_asn1_strcmp (value, p->value))
            {
@@ -496,7 +496,7 @@ asn1_write_value (asn1_node node_root, const char *name,
        }
       _asn1_set_value (node, value, _asn1_strlen (value) + 1);
       break;
-    case TYPE_TIME:
+    case ASN1_ETYPE_TIME:
       if (node->type & CONST_UTC)
        {
          if (_asn1_strlen (value) < 11)
@@ -542,17 +542,21 @@ asn1_write_value (asn1_node node_root, const char *name,
            _asn1_set_value (node, value, _asn1_strlen (value) + 1);
        }
       break;
-    case TYPE_OCTET_STRING:
+    case ASN1_ETYPE_OCTET_STRING:
+    case ASN1_ETYPE_GENERALSTRING:
+    case ASN1_ETYPE_NUMERICSTRING:
+    case ASN1_ETYPE_IA5STRING:
+    case ASN1_ETYPE_TELETEXSTRING:
+    case ASN1_ETYPE_PRINTABLESTRING:
+    case ASN1_ETYPE_UNIVERSALSTRING:
+    case ASN1_ETYPE_BMPSTRING:
+    case ASN1_ETYPE_UTF8STRING:
+    case ASN1_ETYPE_VISIBLESTRING:
       if (len == 0)
        len = _asn1_strlen (value);
       _asn1_set_value_octet (node, value, len);
       break;
-    case TYPE_GENERALSTRING:
-      if (len == 0)
-       len = _asn1_strlen (value);
-      _asn1_set_value_octet (node, value, len);
-      break;
-    case TYPE_BIT_STRING:
+    case ASN1_ETYPE_BIT_STRING:
       if (len == 0)
        len = _asn1_strlen (value);
       asn1_length_der ((len >> 3) + 2, NULL, &len2);
@@ -564,7 +568,7 @@ asn1_write_value (asn1_node node_root, const char *name,
       _asn1_set_value_m (node, temp, len2);
       temp = NULL;
       break;
-    case TYPE_CHOICE:
+    case ASN1_ETYPE_CHOICE:
       p = node->down;
       while (p)
        {
@@ -588,11 +592,11 @@ asn1_write_value (asn1_node node_root, const char *name,
       if (!p)
        return ASN1_ELEMENT_NOT_FOUND;
       break;
-    case TYPE_ANY:
+    case ASN1_ETYPE_ANY:
       _asn1_set_value_octet (node, value, len);
       break;
-    case TYPE_SEQUENCE_OF:
-    case TYPE_SET_OF:
+    case ASN1_ETYPE_SEQUENCE_OF:
+    case ASN1_ETYPE_SET_OF:
       if (_asn1_strcmp (value, "NEW"))
        return ASN1_VALUE_NOT_VALID;
       _asn1_append_sequence_set (node);
@@ -705,22 +709,22 @@ asn1_read_value (asn1_node root, const char *name, void 
*ivalue, int *len)
   if (node == NULL)
     return ASN1_ELEMENT_NOT_FOUND;
 
-  if ((type_field (node->type) != TYPE_NULL) &&
-      (type_field (node->type) != TYPE_CHOICE) &&
+  if ((type_field (node->type) != ASN1_ETYPE_NULL) &&
+      (type_field (node->type) != ASN1_ETYPE_CHOICE) &&
       !(node->type & CONST_DEFAULT) && !(node->type & CONST_ASSIGN) &&
       (node->value == NULL))
     return ASN1_VALUE_NOT_FOUND;
 
   switch (type_field (node->type))
     {
-    case TYPE_NULL:
+    case ASN1_ETYPE_NULL:
       PUT_STR_VALUE (value, value_size, "NULL");
       break;
-    case TYPE_BOOLEAN:
+    case ASN1_ETYPE_BOOLEAN:
       if ((node->type & CONST_DEFAULT) && (node->value == NULL))
        {
          p = node->down;
-         while (type_field (p->type) != TYPE_DEFAULT)
+         while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
            p = p->right;
          if (p->type & CONST_TRUE)
            {
@@ -740,12 +744,12 @@ asn1_read_value (asn1_node root, const char *name, void 
*ivalue, int *len)
          PUT_STR_VALUE (value, value_size, "FALSE");
        }
       break;
-    case TYPE_INTEGER:
-    case TYPE_ENUMERATED:
+    case ASN1_ETYPE_INTEGER:
+    case ASN1_ETYPE_ENUMERATED:
       if ((node->type & CONST_DEFAULT) && (node->value == NULL))
        {
          p = node->down;
-         while (type_field (p->type) != TYPE_DEFAULT)
+         while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
            p = p->right;
          if ((isdigit (p->value[0])) || (p->value[0] == '-')
              || (p->value[0] == '+'))
@@ -759,7 +763,7 @@ asn1_read_value (asn1_node root, const char *name, void 
*ivalue, int *len)
              p2 = node->down;
              while (p2)
                {
-                 if (type_field (p2->type) == TYPE_CONSTANT)
+                 if (type_field (p2->type) == ASN1_ETYPE_CONSTANT)
                    {
                      if (!_asn1_strcmp (p2->name, p->value))
                        {
@@ -783,14 +787,14 @@ asn1_read_value (asn1_node root, const char *name, void 
*ivalue, int *len)
            return ASN1_MEM_ERROR;
        }
       break;
-    case TYPE_OBJECT_ID:
+    case ASN1_ETYPE_OBJECT_ID:
       if (node->type & CONST_ASSIGN)
        {
          value[0] = 0;
          p = node->down;
          while (p)
            {
-             if (type_field (p->type) == TYPE_CONSTANT)
+             if (type_field (p->type) == ASN1_ETYPE_CONSTANT)
                {
                  ADD_STR_VALUE (value, value_size, p->value);
                  if (p->right)
@@ -805,7 +809,7 @@ asn1_read_value (asn1_node root, const char *name, void 
*ivalue, int *len)
       else if ((node->type & CONST_DEFAULT) && (node->value == NULL))
        {
          p = node->down;
-         while (type_field (p->type) != TYPE_DEFAULT)
+         while (type_field (p->type) != ASN1_ETYPE_DEFAULT)
            p = p->right;
          PUT_STR_VALUE (value, value_size, p->value);
        }
@@ -814,34 +818,36 @@ asn1_read_value (asn1_node root, const char *name, void 
*ivalue, int *len)
          PUT_STR_VALUE (value, value_size, node->value);
        }
       break;
-    case TYPE_TIME:
+    case ASN1_ETYPE_TIME:
       PUT_STR_VALUE (value, value_size, node->value);
       break;
-    case TYPE_OCTET_STRING:
-      len2 = -1;
-      if (asn1_get_octet_der
-         (node->value, node->value_len, &len2, value, value_size,
-          len) != ASN1_SUCCESS)
-       return ASN1_MEM_ERROR;
-      break;
-    case TYPE_GENERALSTRING:
+    case ASN1_ETYPE_OCTET_STRING:
+    case ASN1_ETYPE_GENERALSTRING:
+    case ASN1_ETYPE_NUMERICSTRING:
+    case ASN1_ETYPE_IA5STRING:
+    case ASN1_ETYPE_TELETEXSTRING:
+    case ASN1_ETYPE_PRINTABLESTRING:
+    case ASN1_ETYPE_UNIVERSALSTRING:
+    case ASN1_ETYPE_BMPSTRING:
+    case ASN1_ETYPE_UTF8STRING:
+    case ASN1_ETYPE_VISIBLESTRING:
       len2 = -1;
       if (asn1_get_octet_der
          (node->value, node->value_len, &len2, value, value_size,
           len) != ASN1_SUCCESS)
        return ASN1_MEM_ERROR;
       break;
-    case TYPE_BIT_STRING:
+    case ASN1_ETYPE_BIT_STRING:
       len2 = -1;
       if (asn1_get_bit_der
          (node->value, node->value_len, &len2, value, value_size,
           len) != ASN1_SUCCESS)
        return ASN1_MEM_ERROR;
       break;
-    case TYPE_CHOICE:
+    case ASN1_ETYPE_CHOICE:
       PUT_STR_VALUE (value, value_size, node->down->name);
       break;
-    case TYPE_ANY:
+    case ASN1_ETYPE_ANY:
       len3 = -1;
       len2 = asn1_get_length_der (node->value, node->value_len, &len3);
       if (len2 < 0)
@@ -889,7 +895,7 @@ asn1_read_tag (asn1_node root, const char *name, int 
*tagValue,
     {
       while (p)
        {
-         if (type_field (p->type) == TYPE_TAG)
+         if (type_field (p->type) == ASN1_ETYPE_TAG)
            {
              if ((p->type & CONST_IMPLICIT) && (pTag == NULL))
                pTag = p;
@@ -915,26 +921,34 @@ asn1_read_tag (asn1_node root, const char *name, int 
*tagValue,
     }
   else
     {
+      unsigned type = type_field (node->type);
       *classValue = ASN1_CLASS_UNIVERSAL;
 
-      switch (type_field (node->type))
+      switch (type)
        {
-       case TYPE_NULL:
-         *tagValue = ASN1_TAG_NULL;
+       case ASN1_ETYPE_NULL:
+       case ASN1_ETYPE_BOOLEAN:
+       case ASN1_ETYPE_INTEGER:
+       case ASN1_ETYPE_ENUMERATED:
+       case ASN1_ETYPE_OBJECT_ID:
+       case ASN1_ETYPE_OCTET_STRING:
+       case ASN1_ETYPE_GENERALSTRING:
+        case ASN1_ETYPE_NUMERICSTRING:
+        case ASN1_ETYPE_IA5STRING:
+        case ASN1_ETYPE_TELETEXSTRING:
+        case ASN1_ETYPE_PRINTABLESTRING:
+        case ASN1_ETYPE_UNIVERSALSTRING:
+        case ASN1_ETYPE_BMPSTRING:
+        case ASN1_ETYPE_UTF8STRING:
+        case ASN1_ETYPE_VISIBLESTRING:
+       case ASN1_ETYPE_BIT_STRING:
+       case ASN1_ETYPE_SEQUENCE:
+       case ASN1_ETYPE_SEQUENCE_OF:
+       case ASN1_ETYPE_SET:
+       case ASN1_ETYPE_SET_OF:
+         *tagValue = _asn1_tags[type].tag;
          break;
-       case TYPE_BOOLEAN:
-         *tagValue = ASN1_TAG_BOOLEAN;
-         break;
-       case TYPE_INTEGER:
-         *tagValue = ASN1_TAG_INTEGER;
-         break;
-       case TYPE_ENUMERATED:
-         *tagValue = ASN1_TAG_ENUMERATED;
-         break;
-       case TYPE_OBJECT_ID:
-         *tagValue = ASN1_TAG_OBJECT_ID;
-         break;
-       case TYPE_TIME:
+       case ASN1_ETYPE_TIME:
          if (node->type & CONST_UTC)
            {
              *tagValue = ASN1_TAG_UTCTime;
@@ -942,26 +956,10 @@ asn1_read_tag (asn1_node root, const char *name, int 
*tagValue,
          else
            *tagValue = ASN1_TAG_GENERALIZEDTime;
          break;
-       case TYPE_OCTET_STRING:
-         *tagValue = ASN1_TAG_OCTET_STRING;
-         break;
-       case TYPE_GENERALSTRING:
-         *tagValue = ASN1_TAG_GENERALSTRING;
-         break;
-       case TYPE_BIT_STRING:
-         *tagValue = ASN1_TAG_BIT_STRING;
-         break;
-       case TYPE_SEQUENCE:
-       case TYPE_SEQUENCE_OF:
-         *tagValue = ASN1_TAG_SEQUENCE;
-         break;
-       case TYPE_SET:
-       case TYPE_SET_OF:
-         *tagValue = ASN1_TAG_SET;
-         break;
-       case TYPE_TAG:
-       case TYPE_CHOICE:
-       case TYPE_ANY:
+       case ASN1_ETYPE_TAG:
+       case ASN1_ETYPE_CHOICE:
+       case ASN1_ETYPE_ANY:
+         *tagValue = -1;
          break;
        default:
          break;
diff --git a/lib/int.h b/lib/int.h
index 0908284..7791906 100644
--- a/lib/int.h
+++ b/lib/int.h
@@ -58,6 +58,13 @@ struct asn1_node_st
   unsigned char small_value[ASN1_SMALL_VALUE_SIZE];    /* For small values */
 };
 
+typedef struct tag_and_class_st {
+  unsigned tag;
+  unsigned class;
+} tag_and_class_st;
+
+extern tag_and_class_st _asn1_tags[];
+
 #define _asn1_strlen(s) strlen((const char *) s)
 #define _asn1_strtol(n,e,b) strtol((const char *) n, e, b)
 #define _asn1_strtoul(n,e,b) strtoul((const char *) n, e, b)
@@ -78,31 +85,6 @@ struct asn1_node_st
 /****************************************/
 #define type_field(x)     (x&0xFF)
 
-/* List of constants for field type of typedef asn1_node_st  */
-#define TYPE_CONSTANT      ASN1_ETYPE_CONSTANT
-#define TYPE_IDENTIFIER    ASN1_ETYPE_IDENTIFIER
-#define TYPE_INTEGER       ASN1_ETYPE_INTEGER
-#define TYPE_BOOLEAN       ASN1_ETYPE_BOOLEAN
-#define TYPE_SEQUENCE      ASN1_ETYPE_SEQUENCE
-#define TYPE_BIT_STRING    ASN1_ETYPE_BIT_STRING
-#define TYPE_OCTET_STRING  ASN1_ETYPE_OCTET_STRING
-#define TYPE_TAG           ASN1_ETYPE_TAG
-#define TYPE_DEFAULT       ASN1_ETYPE_DEFAULT
-#define TYPE_SIZE          ASN1_ETYPE_SIZE
-#define TYPE_SEQUENCE_OF   ASN1_ETYPE_SEQUENCE_OF
-#define TYPE_OBJECT_ID     ASN1_ETYPE_OBJECT_ID
-#define TYPE_ANY           ASN1_ETYPE_ANY
-#define TYPE_SET           ASN1_ETYPE_SET
-#define TYPE_SET_OF        ASN1_ETYPE_SET_OF
-#define TYPE_DEFINITIONS   ASN1_ETYPE_DEFINITIONS
-#define TYPE_TIME          ASN1_ETYPE_TIME
-#define TYPE_CHOICE        ASN1_ETYPE_CHOICE
-#define TYPE_IMPORTS       ASN1_ETYPE_IMPORTS
-#define TYPE_NULL          ASN1_ETYPE_NULL
-#define TYPE_ENUMERATED    ASN1_ETYPE_ENUMERATED
-#define TYPE_GENERALSTRING ASN1_ETYPE_GENERALSTRING
-
-
 /***********************************************************************/
 /* List of constants to better specify the type of typedef asn1_node_st.   */
 /***********************************************************************/
diff --git a/lib/libtasn1.h b/lib/libtasn1.h
index c80a5ca..ad3b554 100644
--- a/lib/libtasn1.h
+++ b/lib/libtasn1.h
@@ -100,6 +100,14 @@ extern "C"
 #define ASN1_TAG_ENUMERATED            0x0A
 #define ASN1_TAG_NULL                  0x05
 #define ASN1_TAG_GENERALSTRING         0x1B
+#define ASN1_TAG_NUMERICSTRING         0x12
+#define ASN1_TAG_IA5STRING             0x16
+#define ASN1_TAG_TELETEXSTRING         0x14
+#define ASN1_TAG_PRINTABLESTRING       0x13
+#define ASN1_TAG_UNIVERSALSTRING       0x1C
+#define ASN1_TAG_BMPSTRING             0x1E
+#define ASN1_TAG_UTF8STRING            0x0C
+#define ASN1_TAG_VISIBLESTRING         0x1A
 
   /******************************************************/
   /* Structure definition used for the node of the tree */
@@ -126,7 +134,7 @@ extern "C"
   };
   typedef struct asn1_static_node_st asn1_static_node;
 
-/* List of constants for field type of typedef node_asn  */
+/* List of constants for field type of node_asn  */
 #define ASN1_ETYPE_CONSTANT       1
 #define ASN1_ETYPE_IDENTIFIER     2
 #define ASN1_ETYPE_INTEGER        3
@@ -149,6 +157,14 @@ extern "C"
 #define ASN1_ETYPE_NULL          20
 #define ASN1_ETYPE_ENUMERATED    21
 #define ASN1_ETYPE_GENERALSTRING 27
+#define ASN1_ETYPE_NUMERICSTRING 28
+#define ASN1_ETYPE_IA5STRING     29
+#define ASN1_ETYPE_TELETEXSTRING 30
+#define ASN1_ETYPE_PRINTABLESTRING 31
+#define ASN1_ETYPE_UNIVERSALSTRING 32
+#define ASN1_ETYPE_BMPSTRING     33
+#define ASN1_ETYPE_UTF8STRING    34
+#define ASN1_ETYPE_VISIBLESTRING 35
 
   struct asn1_data_node_st
   {
diff --git a/lib/parser_aux.c b/lib/parser_aux.c
index 96ecac6..cced582 100644
--- a/lib/parser_aux.c
+++ b/lib/parser_aux.c
@@ -48,7 +48,7 @@ list_type *firstElement = NULL;
 /* Description: creates a new NODE_ASN element and    */
 /* puts it in the list pointed by firstElement.       */
 /* Parameters:                                        */
-/*   type: type of the new element (see TYPE_         */
+/*   type: type of the new element (see ASN1_ETYPE_         */
 /*         and CONST_ constants).                     */
 /* Return: pointer to the new element.                */
 /******************************************************/
@@ -581,7 +581,7 @@ _asn1_change_integer_value (asn1_node node)
   p = node;
   while (p)
     {
-      if ((type_field (p->type) == TYPE_INTEGER) && (p->type & CONST_ASSIGN))
+      if ((type_field (p->type) == ASN1_ETYPE_INTEGER) && (p->type & 
CONST_ASSIGN))
        {
          if (p->value)
            {
@@ -653,11 +653,11 @@ _asn1_expand_object_id (asn1_node node)
     {
       if (move != UP)
        {
-         if ((type_field (p->type) == TYPE_OBJECT_ID)
+         if ((type_field (p->type) == ASN1_ETYPE_OBJECT_ID)
              && (p->type & CONST_ASSIGN))
            {
              p2 = p->down;
-             if (p2 && (type_field (p2->type) == TYPE_CONSTANT))
+             if (p2 && (type_field (p2->type) == ASN1_ETYPE_CONSTANT))
                {
                  if (p2->value && !isdigit (p2->value[0]))
                    {
@@ -666,7 +666,7 @@ _asn1_expand_object_id (asn1_node node)
                      _asn1_str_cat (name2, sizeof (name2),
                                     (char *) p2->value);
                      p3 = asn1_find_node (node, name2);
-                     if (!p3 || (type_field (p3->type) != TYPE_OBJECT_ID) ||
+                     if (!p3 || (type_field (p3->type) != 
ASN1_ETYPE_OBJECT_ID) ||
                          !(p3->type & CONST_ASSIGN))
                        return ASN1_ELEMENT_NOT_FOUND;
                      _asn1_set_down (p, p2->right);
@@ -675,9 +675,9 @@ _asn1_expand_object_id (asn1_node node)
                      p4 = p3->down;
                      while (p4)
                        {
-                         if (type_field (p4->type) == TYPE_CONSTANT)
+                         if (type_field (p4->type) == ASN1_ETYPE_CONSTANT)
                            {
-                             p5 = _asn1_add_single_node (TYPE_CONSTANT);
+                             p5 = _asn1_add_single_node (ASN1_ETYPE_CONSTANT);
                              _asn1_set_name (p5, p4->name);
                              tlen = _asn1_strlen (p4->value);
                              if (tlen > 0)
@@ -742,24 +742,24 @@ _asn1_expand_object_id (asn1_node node)
     {
       if (move != UP)
        {
-         if ((type_field (p->type) == TYPE_OBJECT_ID) &&
+         if ((type_field (p->type) == ASN1_ETYPE_OBJECT_ID) &&
              (p->type & CONST_DEFAULT))
            {
              p2 = p->down;
-             if (p2 && (type_field (p2->type) == TYPE_DEFAULT))
+             if (p2 && (type_field (p2->type) == ASN1_ETYPE_DEFAULT))
                {
                  _asn1_str_cpy (name2, sizeof (name2), name_root);
                  _asn1_str_cat (name2, sizeof (name2), ".");
                  _asn1_str_cat (name2, sizeof (name2), (char *) p2->value);
                  p3 = asn1_find_node (node, name2);
-                 if (!p3 || (type_field (p3->type) != TYPE_OBJECT_ID) ||
+                 if (!p3 || (type_field (p3->type) != ASN1_ETYPE_OBJECT_ID) ||
                      !(p3->type & CONST_ASSIGN))
                    return ASN1_ELEMENT_NOT_FOUND;
                  p4 = p3->down;
                  name2[0] = 0;
                  while (p4)
                    {
-                     if (type_field (p4->type) == TYPE_CONSTANT)
+                     if (type_field (p4->type) == ASN1_ETYPE_CONSTANT)
                        {
                          if (name2[0])
                            _asn1_str_cat (name2, sizeof (name2), ".");
@@ -833,12 +833,12 @@ _asn1_type_set_config (asn1_node node)
     {
       if (move != UP)
        {
-         if (type_field (p->type) == TYPE_SET)
+         if (type_field (p->type) == ASN1_ETYPE_SET)
            {
              p2 = p->down;
              while (p2)
                {
-                 if (type_field (p2->type) != TYPE_TAG)
+                 if (type_field (p2->type) != ASN1_ETYPE_TAG)
                    p2->type |= CONST_SET | CONST_NOT_USED;
                  p2 = p2->right;
                }
@@ -902,7 +902,7 @@ _asn1_check_identifier (asn1_node node)
   p = node;
   while (p)
     {
-      if (type_field (p->type) == TYPE_IDENTIFIER)
+      if (type_field (p->type) == ASN1_ETYPE_IDENTIFIER)
        {
          _asn1_str_cpy (name2, sizeof (name2), node->name);
          _asn1_str_cat (name2, sizeof (name2), ".");
@@ -917,29 +917,29 @@ _asn1_check_identifier (asn1_node node)
              return ASN1_IDENTIFIER_NOT_FOUND;
            }
        }
-      else if ((type_field (p->type) == TYPE_OBJECT_ID) &&
+      else if ((type_field (p->type) == ASN1_ETYPE_OBJECT_ID) &&
               (p->type & CONST_DEFAULT))
        {
          p2 = p->down;
-         if (p2 && (type_field (p2->type) == TYPE_DEFAULT))
+         if (p2 && (type_field (p2->type) == ASN1_ETYPE_DEFAULT))
            {
              _asn1_str_cpy (name2, sizeof (name2), node->name);
              _asn1_str_cat (name2, sizeof (name2), ".");
              _asn1_str_cat (name2, sizeof (name2), (char *) p2->value);
              _asn1_strcpy (_asn1_identifierMissing, p2->value);
              p2 = asn1_find_node (node, name2);
-             if (!p2 || (type_field (p2->type) != TYPE_OBJECT_ID) ||
+             if (!p2 || (type_field (p2->type) != ASN1_ETYPE_OBJECT_ID) ||
                  !(p2->type & CONST_ASSIGN))
                return ASN1_IDENTIFIER_NOT_FOUND;
              else
                _asn1_identifierMissing[0] = 0;
            }
        }
-      else if ((type_field (p->type) == TYPE_OBJECT_ID) &&
+      else if ((type_field (p->type) == ASN1_ETYPE_OBJECT_ID) &&
               (p->type & CONST_ASSIGN))
        {
          p2 = p->down;
-         if (p2 && (type_field (p2->type) == TYPE_CONSTANT))
+         if (p2 && (type_field (p2->type) == ASN1_ETYPE_CONSTANT))
            {
              if (p2->value && !isdigit (p2->value[0]))
                {
@@ -948,7 +948,7 @@ _asn1_check_identifier (asn1_node node)
                  _asn1_str_cat (name2, sizeof (name2), (char *) p2->value);
                  _asn1_strcpy (_asn1_identifierMissing, p2->value);
                  p2 = asn1_find_node (node, name2);
-                 if (!p2 || (type_field (p2->type) != TYPE_OBJECT_ID) ||
+                 if (!p2 || (type_field (p2->type) != ASN1_ETYPE_OBJECT_ID) ||
                      !(p2->type & CONST_ASSIGN))
                    return ASN1_IDENTIFIER_NOT_FOUND;
                  else
@@ -1002,13 +1002,13 @@ _asn1_set_default_tag (asn1_node node)
 {
   asn1_node p;
 
-  if ((node == NULL) || (type_field (node->type) != TYPE_DEFINITIONS))
+  if ((node == NULL) || (type_field (node->type) != ASN1_ETYPE_DEFINITIONS))
     return ASN1_ELEMENT_NOT_FOUND;
 
   p = node;
   while (p)
     {
-      if ((type_field (p->type) == TYPE_TAG) &&
+      if ((type_field (p->type) == ASN1_ETYPE_TAG) &&
          !(p->type & CONST_EXPLICIT) && !(p->type & CONST_IMPLICIT))
        {
          if (node->type & CONST_EXPLICIT)
diff --git a/lib/structure.c b/lib/structure.c
index 32be50b..34fd6f0 100644
--- a/lib/structure.c
+++ b/lib/structure.c
@@ -40,7 +40,7 @@ extern char _asn1_identifierMissing[];
 /* Function : _asn1_add_single_node                     */
 /* Description: creates a new NODE_ASN element.       */
 /* Parameters:                                        */
-/*   type: type of the new element (see TYPE_         */
+/*   type: type of the new element (see ASN1_ETYPE_         */
 /*         and CONST_ constants).                     */
 /* Return: pointer to the new element.                */
 /******************************************************/
@@ -457,18 +457,18 @@ _asn1_type_choice_config (asn1_node node)
     {
       if (move != UP)
        {
-         if ((type_field (p->type) == TYPE_CHOICE) && (p->type & CONST_TAG))
+         if ((type_field (p->type) == ASN1_ETYPE_CHOICE) && (p->type & 
CONST_TAG))
            {
              p2 = p->down;
              while (p2)
                {
-                 if (type_field (p2->type) != TYPE_TAG)
+                 if (type_field (p2->type) != ASN1_ETYPE_TAG)
                    {
                      p2->type |= CONST_TAG;
                      p3 = _asn1_find_left (p2);
                      while (p3)
                        {
-                         if (type_field (p3->type) == TYPE_TAG)
+                         if (type_field (p3->type) == ASN1_ETYPE_TAG)
                            {
                              p4 = _asn1_add_single_node (p3->type);
                              tlen = _asn1_strlen (p3->value);
@@ -487,7 +487,7 @@ _asn1_type_choice_config (asn1_node node)
              while (p2)
                {
                  p3 = p2->right;
-                 if (type_field (p2->type) == TYPE_TAG)
+                 if (type_field (p2->type) == ASN1_ETYPE_TAG)
                    asn1_delete_structure (&p2);
                  p2 = p3;
                }
@@ -543,7 +543,7 @@ _asn1_expand_identifier (asn1_node * node, asn1_node root)
     {
       if (move != UP)
        {
-         if (type_field (p->type) == TYPE_IDENTIFIER)
+         if (type_field (p->type) == ASN1_ETYPE_IDENTIFIER)
            {
              snprintf(name2, sizeof (name2), "%s.%s", root->name, p->value);
              p2 = _asn1_copy_structure2 (root, name2);
@@ -715,9 +715,9 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
        {
          switch (type_field (p->type))
            {
-           case TYPE_CONSTANT:
-           case TYPE_TAG:
-           case TYPE_SIZE:
+           case ASN1_ETYPE_CONSTANT:
+           case ASN1_ETYPE_TAG:
+           case ASN1_ETYPE_SIZE:
              break;
            default:
              for (k = 0; k < indent; k++)
@@ -734,70 +734,94 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
        {
          switch (type_field (p->type))
            {
-           case TYPE_CONSTANT:
+           case ASN1_ETYPE_CONSTANT:
              if (mode == ASN1_PRINT_ALL)
                fprintf (out, "type:CONST");
              break;
-           case TYPE_TAG:
+           case ASN1_ETYPE_TAG:
              if (mode == ASN1_PRINT_ALL)
                fprintf (out, "type:TAG");
              break;
-           case TYPE_SIZE:
+           case ASN1_ETYPE_SIZE:
              if (mode == ASN1_PRINT_ALL)
                fprintf (out, "type:SIZE");
              break;
-           case TYPE_DEFAULT:
+           case ASN1_ETYPE_DEFAULT:
              fprintf (out, "type:DEFAULT");
              break;
-           case TYPE_NULL:
+           case ASN1_ETYPE_NULL:
              fprintf (out, "type:NULL");
              break;
-           case TYPE_IDENTIFIER:
+           case ASN1_ETYPE_IDENTIFIER:
              fprintf (out, "type:IDENTIFIER");
              break;
-           case TYPE_INTEGER:
+           case ASN1_ETYPE_INTEGER:
              fprintf (out, "type:INTEGER");
              break;
-           case TYPE_ENUMERATED:
+           case ASN1_ETYPE_ENUMERATED:
              fprintf (out, "type:ENUMERATED");
              break;
-           case TYPE_TIME:
+           case ASN1_ETYPE_TIME:
              fprintf (out, "type:TIME");
              break;
-           case TYPE_BOOLEAN:
+           case ASN1_ETYPE_BOOLEAN:
              fprintf (out, "type:BOOLEAN");
              break;
-           case TYPE_SEQUENCE:
+           case ASN1_ETYPE_SEQUENCE:
              fprintf (out, "type:SEQUENCE");
              break;
-           case TYPE_BIT_STRING:
+           case ASN1_ETYPE_BIT_STRING:
              fprintf (out, "type:BIT_STR");
              break;
-           case TYPE_OCTET_STRING:
+           case ASN1_ETYPE_OCTET_STRING:
              fprintf (out, "type:OCT_STR");
              break;
-           case TYPE_GENERALSTRING:
+           case ASN1_ETYPE_GENERALSTRING:
              fprintf (out, "type:GENERALSTRING");
              break;
-           case TYPE_SEQUENCE_OF:
+           case ASN1_ETYPE_NUMERICSTRING:
+             fprintf (out, "type:NUMERICSTRING");
+             break;
+           case ASN1_ETYPE_IA5STRING:
+             fprintf (out, "type:IA5STRING");
+             break;
+           case ASN1_ETYPE_TELETEXSTRING:
+             fprintf (out, "type:TELETEXSTRING");
+             break;
+           case ASN1_ETYPE_PRINTABLESTRING:
+             fprintf (out, "type:PRINTABLESTRING");
+             break;
+           case ASN1_ETYPE_UNIVERSALSTRING:
+             fprintf (out, "type:UNIVERSALSTRING");
+             break;
+           case ASN1_ETYPE_BMPSTRING:
+             fprintf (out, "type:BMPSTRING");
+             break;
+           case ASN1_ETYPE_UTF8STRING:
+             fprintf (out, "type:UTF8STRING");
+             break;
+           case ASN1_ETYPE_VISIBLESTRING:
+             fprintf (out, "type:VISIBLESTRING");
+             break;
+           case ASN1_ETYPE_SEQUENCE_OF:
              fprintf (out, "type:SEQ_OF");
              break;
-           case TYPE_OBJECT_ID:
+           case ASN1_ETYPE_OBJECT_ID:
              fprintf (out, "type:OBJ_ID");
              break;
-           case TYPE_ANY:
+           case ASN1_ETYPE_ANY:
              fprintf (out, "type:ANY");
              break;
-           case TYPE_SET:
+           case ASN1_ETYPE_SET:
              fprintf (out, "type:SET");
              break;
-           case TYPE_SET_OF:
+           case ASN1_ETYPE_SET_OF:
              fprintf (out, "type:SET_OF");
              break;
-           case TYPE_CHOICE:
+           case ASN1_ETYPE_CHOICE:
              fprintf (out, "type:CHOICE");
              break;
-           case TYPE_DEFINITIONS:
+           case ASN1_ETYPE_DEFINITIONS:
              fprintf (out, "type:DEFINITIONS");
              break;
            default:
@@ -809,22 +833,22 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
        {
          switch (type_field (p->type))
            {
-           case TYPE_CONSTANT:
+           case ASN1_ETYPE_CONSTANT:
              if (mode == ASN1_PRINT_ALL)
                if (p->value)
                  fprintf (out, "  value:%s", p->value);
              break;
-           case TYPE_TAG:
+           case ASN1_ETYPE_TAG:
              if (mode == ASN1_PRINT_ALL)
                if (p->value)
                  fprintf (out, "  value:%s", p->value);
              break;
-           case TYPE_SIZE:
+           case ASN1_ETYPE_SIZE:
              if (mode == ASN1_PRINT_ALL)
                if (p->value)
                  fprintf (out, "  value:%s", p->value);
              break;
-           case TYPE_DEFAULT:
+           case ASN1_ETYPE_DEFAULT:
              if (p->value)
                fprintf (out, "  value:%s", p->value);
              else if (p->type & CONST_TRUE)
@@ -832,11 +856,11 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
              else if (p->type & CONST_FALSE)
                fprintf (out, "  value:FALSE");
              break;
-           case TYPE_IDENTIFIER:
+           case ASN1_ETYPE_IDENTIFIER:
              if (p->value)
                fprintf (out, "  value:%s", p->value);
              break;
-           case TYPE_INTEGER:
+           case ASN1_ETYPE_INTEGER:
              if (p->value)
                {
                  len2 = -1;
@@ -847,7 +871,7 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
                      fprintf (out, "%02x", (p->value)[k + len2]);
                }
              break;
-           case TYPE_ENUMERATED:
+           case ASN1_ETYPE_ENUMERATED:
              if (p->value)
                {
                  len2 = -1;
@@ -858,11 +882,11 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
                      fprintf (out, "%02x", (p->value)[k + len2]);
                }
              break;
-           case TYPE_TIME:
+           case ASN1_ETYPE_TIME:
              if (p->value)
                fprintf (out, "  value:%s", p->value);
              break;
-           case TYPE_BOOLEAN:
+           case ASN1_ETYPE_BOOLEAN:
              if (p->value)
                {
                  if (p->value[0] == 'T')
@@ -871,7 +895,7 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
                    fprintf (out, "  value:FALSE");
                }
              break;
-           case TYPE_BIT_STRING:
+           case ASN1_ETYPE_BIT_STRING:
              if (p->value)
                {
                  len2 = -1;
@@ -885,18 +909,16 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
                    }
                }
              break;
-           case TYPE_OCTET_STRING:
-             if (p->value)
-               {
-                 len2 = -1;
-                 len = asn1_get_length_der (p->value, p->value_len, &len2);
-                 fprintf (out, "  value:");
-                 if (len > 0)
-                   for (k = 0; k < len; k++)
-                     fprintf (out, "%02x", (p->value)[k + len2]);
-               }
-             break;
-           case TYPE_GENERALSTRING:
+           case ASN1_ETYPE_OCTET_STRING:
+           case ASN1_ETYPE_GENERALSTRING:
+           case ASN1_ETYPE_NUMERICSTRING:
+           case ASN1_ETYPE_IA5STRING:
+           case ASN1_ETYPE_TELETEXSTRING:
+           case ASN1_ETYPE_PRINTABLESTRING:
+           case ASN1_ETYPE_UNIVERSALSTRING:
+           case ASN1_ETYPE_BMPSTRING:
+           case ASN1_ETYPE_UTF8STRING:
+           case ASN1_ETYPE_VISIBLESTRING:
              if (p->value)
                {
                  len2 = -1;
@@ -907,11 +929,11 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
                      fprintf (out, "%02x", (p->value)[k + len2]);
                }
              break;
-           case TYPE_OBJECT_ID:
+           case ASN1_ETYPE_OBJECT_ID:
              if (p->value)
                fprintf (out, "  value:%s", p->value);
              break;
-           case TYPE_ANY:
+           case ASN1_ETYPE_ANY:
              if (p->value)
                {
                  len3 = -1;
@@ -922,13 +944,13 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
                      fprintf (out, "%02x", (p->value)[k + len3]);
                }
              break;
-           case TYPE_SET:
-           case TYPE_SET_OF:
-           case TYPE_CHOICE:
-           case TYPE_DEFINITIONS:
-           case TYPE_SEQUENCE_OF:
-           case TYPE_SEQUENCE:
-           case TYPE_NULL:
+           case ASN1_ETYPE_SET:
+           case ASN1_ETYPE_SET_OF:
+           case ASN1_ETYPE_CHOICE:
+           case ASN1_ETYPE_DEFINITIONS:
+           case ASN1_ETYPE_SEQUENCE_OF:
+           case ASN1_ETYPE_SEQUENCE:
+           case ASN1_ETYPE_NULL:
              break;
            default:
              break;
@@ -991,9 +1013,9 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
        {
          switch (type_field (p->type))
            {
-           case TYPE_CONSTANT:
-           case TYPE_TAG:
-           case TYPE_SIZE:
+           case ASN1_ETYPE_CONSTANT:
+           case ASN1_ETYPE_TAG:
+           case ASN1_ETYPE_SIZE:
              break;
            default:
              fprintf (out, "\n");
@@ -1105,7 +1127,7 @@ asn1_find_structure_from_oid (asn1_node definitions, 
const char *oidValue)
   p = definitions->down;
   while (p)
     {
-      if ((type_field (p->type) == TYPE_OBJECT_ID) &&
+      if ((type_field (p->type) == ASN1_ETYPE_OBJECT_ID) &&
          (p->type & CONST_ASSIGN))
        {
          strcpy (name, definitionsName);
diff --git a/tests/Test_parser.c b/tests/Test_parser.c
index 4adb0bf..4ba1636 100644
--- a/tests/Test_parser.c
+++ b/tests/Test_parser.c
@@ -47,7 +47,7 @@ test_type test_array[] = {
   /* Test DEFINITIONS syntax */
   {5,
    "TEST_PARSER2 { } DEFINITIONS IMPLICIT TAGS ::= BEGIN int1 ::= INTEGER END",
-   ASN1_SYNTAX_ERROR, _FILE_ ":6: parse error near 'TEST_PARSER'"},
+   ASN1_SYNTAX_ERROR, _FILE_ ":6: Error: syntax error, unexpected IDENTIFIER, 
expecting $end near 'TEST_PARSER'"},
   {6, "TEST_PARSER { }", ASN1_SUCCESS, ""},
 
   /* Test ASN1_MAX_NAME_SIZE (128) */
@@ -79,13 +79,13 @@ test_type test_array[] = {
   {14, "int1 [1] IMPLICIT INTEGER,", ASN1_SUCCESS, ""},
   {12, "Integer ::= [1] EXPLICIT INTEGER {v1(-1), v2(1)}", ASN1_SUCCESS, ""},
   {12, "Integer ::= INTEGER {v1(0), v2}",
-   ASN1_SYNTAX_ERROR, _FILE_ ":12: parse error near '}'"},
+   ASN1_SYNTAX_ERROR, _FILE_ ":12: Error: syntax error, unexpected '}', 
expecting '(' near '}'"},
   {12, "Integer ::= INTEGER {v1(0), 1}",
-   ASN1_SYNTAX_ERROR, _FILE_ ":12: parse error near '1'"},
+   ASN1_SYNTAX_ERROR, _FILE_ ":12: Error: syntax error, unexpected NUM, 
expecting IDENTIFIER or '(' near '1'"},
   {12, "const1 INTEGER ::= -1", ASN1_SUCCESS, ""},
   {12, "const1 INTEGER ::= 1", ASN1_SUCCESS, ""},
   {12, "const1 INTEGER ::= v1",
-   ASN1_SYNTAX_ERROR, _FILE_ ":12: parse error near 'v1'"},
+   ASN1_SYNTAX_ERROR, _FILE_ ":12: Error: syntax error, unexpected IDENTIFIER, 
expecting NUM or '+' or '-' near 'v1'"},
   {16, " generic generalstring",
    ASN1_IDENTIFIER_NOT_FOUND,
    _FILE_ ":: identifier 'generalstring' not found"},
@@ -96,7 +96,7 @@ test_type test_array[] = {
   {20, "   oid1    OBJECT IDENTIFIER DEFAULT 1",
    ASN1_IDENTIFIER_NOT_FOUND, _FILE_ ":: identifier '1' not found"},
   {20, "   oid1    OBJECT IDENTIFIER DEFAULT",
-   ASN1_SYNTAX_ERROR, _FILE_ ":21: parse error near '}'"},
+   ASN1_SYNTAX_ERROR, _FILE_ ":21: Error: syntax error, unexpected '}' near 
'}'"},
   {20, "   oid1    OBJECT IDENTIFIER DEFAULT Oid-type1",
    ASN1_SUCCESS, ""},
 
@@ -208,6 +208,7 @@ main (int argc, char *argv[])
                  asn1_strerror (test->errorNumber), test->errorDescription);
          printf ("  Error detected: %s - %s\n\n", asn1_strerror (result),
                  errorDescription);
+          exit(1);
        }
 
       test++;


hooks/post-receive
-- 
GNU libtasn1



reply via email to

[Prev in Thread] Current Thread [Next in Thread]