name is now a statically allocated string and other optimizations.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 12 Sep 2012 20:19:08 +0000 (22:19 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 12 Sep 2012 20:19:08 +0000 (22:19 +0200)
lib/decoding.c
lib/element.c
lib/int.h
lib/libtasn1.h
lib/parser_aux.c
lib/parser_aux.h
lib/structure.c

index e6cdb98..4f21d24 100644 (file)
@@ -1428,7 +1428,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
       goto cleanup;
     }
 
-  if ((*structure)->name)
+  if ((*structure)->name[0] != 0)
     {                          /* Has *structure got a name? */
       nameLen -= strlen ((*structure)->name);
       if (nameLen > 0)
@@ -2596,7 +2596,7 @@ asn1_expand_any_defined_by (ASN1_TYPE definitions, ASN1_TYPE * element)
              p3 = p3->down;
              while (p3)
                {
-                 if ((p3->name) && !(strcmp (p3->name, p2->name)))
+                 if (!(strcmp (p3->name, p2->name)))
                    break;
                  p3 = p3->right;
                }
@@ -2618,7 +2618,7 @@ asn1_expand_any_defined_by (ASN1_TYPE definitions, ASN1_TYPE * element)
 
                  while (p3)
                    {
-                     if ((p3->name) && !(strcmp (p3->name, p2->name)))
+                     if (!(strcmp (p3->name, p2->name)))
                        break;
                      p3 = p3->right;
                    }
index ead899c..70b272b 100644 (file)
@@ -45,7 +45,7 @@ _asn1_hierarchical_name (ASN1_TYPE node, char *name, int name_size)
 
   while (p != NULL)
     {
-      if (p->name != NULL)
+      if (p->name[0] != 0)
        {
          _asn1_str_cpy (tmp_name, sizeof (tmp_name), name),
            _asn1_str_cpy (name, name_size, p->name);
@@ -145,7 +145,7 @@ _asn1_append_sequence_set (ASN1_TYPE node)
     p = p->right;
   _asn1_set_right (p, p2);
 
-  if (p->name == NULL)
+  if (p->name[0] == 0)
     _asn1_str_cpy (temp, sizeof (temp), "?1");
   else
     {
@@ -360,7 +360,7 @@ asn1_write_value (ASN1_TYPE node_root, const char *name,
                {
                  if (type_field (p->type) == TYPE_CONSTANT)
                    {
-                     if ((p->name) && (!_asn1_strcmp (p->name, value)))
+                     if (!_asn1_strcmp (p->name, value))
                        {
                          value_temp =
                            (unsigned char *)
@@ -443,7 +443,7 @@ asn1_write_value (ASN1_TYPE node_root, const char *name,
                {
                  if (type_field (p2->type) == TYPE_CONSTANT)
                    {
-                     if ((p2->name) && (!_asn1_strcmp (p2->name, p->value)))
+                     if (!_asn1_strcmp (p2->name, p->value))
                        {
                          default_temp =
                            (unsigned char *)
@@ -767,7 +767,7 @@ asn1_read_value (ASN1_TYPE root, const char *name, void *ivalue, int *len)
                {
                  if (type_field (p2->type) == TYPE_CONSTANT)
                    {
-                     if ((p2->name) && (!_asn1_strcmp (p2->name, p->value)))
+                     if (!_asn1_strcmp (p2->name, p->value))
                        {
                          if (_asn1_convert_integer
                              (p2->value, value, value_size,
index 82de579..edb1d57 100644 (file)
--- a/lib/int.h
+++ b/lib/int.h
@@ -46,7 +46,7 @@
 struct node_asn_struct
 {
   /* public fields: */
-  char *name;                  /* Node name */
+  char name[ASN1_MAX_NAME_SIZE];                       /* Node name */
   unsigned int type;           /* Node type */
   unsigned char *value;                /* Node value */
   int value_len;
index 9991941..30154ae 100644 (file)
@@ -44,7 +44,7 @@ extern "C"
 {
 #endif
 
-#define ASN1_VERSION "2.14"
+#define ASN1_VERSION "3.0"
 
   typedef int asn1_retCode;    /* type returned by libtasn1 functions */
 
@@ -112,6 +112,11 @@ extern "C"
 
   typedef node_asn *ASN1_TYPE;
 
+
+  /* maximum number of characters of a name */
+  /* inside a file with ASN1 definitons     */
+#define ASN1_MAX_NAME_SIZE 128
+
 #define ASN1_TYPE_EMPTY  NULL
 
   /*****************************************/
@@ -129,9 +134,6 @@ extern "C"
   /*  Fixed constants                */
   /***********************************/
 
-  /* maximum number of characters of a name */
-  /* inside a file with ASN1 definitons     */
-#define ASN1_MAX_NAME_SIZE 128
 
   /* maximum number of characters */
   /* of a description message     */
index 2e1f7ee..83de603 100644 (file)
@@ -105,7 +105,7 @@ asn1_find_node (ASN1_TYPE pointer, const char *name)
   p = pointer;
   n_start = name;
 
-  if (p->name != NULL)
+  if (p->name[0] != 0)
     {                          /* has *pointer got a name ? */
       n_end = strchr (n_start, '.');   /* search the first dot */
       if (n_end)
@@ -172,7 +172,7 @@ asn1_find_node (ASN1_TYPE pointer, const char *name)
        {                       /* no "?LAST" */
          while (p)
            {
-             if ((p->name) && (!strcmp (p->name, n)))
+             if (!strcmp (p->name, n))
                break;
              else
                p = p->right;
@@ -349,23 +349,14 @@ _asn1_set_name (ASN1_TYPE node, const char *name)
   if (node == NULL)
     return node;
 
-  if (node->name)
+  if (name == NULL)
     {
-      _asn1_free (node->name);
-      node->name = NULL;
+      node->name[0] = 0;
+      return node;
     }
 
-  if (name == NULL)
-    return node;
+  _asn1_str_cpy (node->name, sizeof (node->name), name);
 
-  if (strlen (name))
-    {
-      node->name = (char *) _asn1_strdup (name);
-      if (node->name == NULL)
-       return NULL;
-    }
-  else
-    node->name = NULL;
   return node;
 }
 
@@ -389,21 +380,6 @@ _asn1_set_right (ASN1_TYPE node, ASN1_TYPE right)
   return node;
 }
 
-/******************************************************************/
-/* Function : _asn1_get_right                                     */
-/* Description: returns the element pointed by the RIGHT field of */
-/*              a NODE_ASN element.                               */
-/* Parameters:                                                    */
-/*   node: NODE_ASN element pointer.                              */
-/* Return: field RIGHT of NODE.                                   */
-/******************************************************************/
-ASN1_TYPE
-_asn1_get_right (ASN1_TYPE node)
-{
-  if (node == NULL)
-    return NULL;
-  return node->right;
-}
 
 /******************************************************************/
 /* Function : _asn1_get_last_right                                */
@@ -426,78 +402,6 @@ _asn1_get_last_right (ASN1_TYPE node)
 }
 
 /******************************************************************/
-/* Function : _asn1_set_down                                      */
-/* Description: sets the field DOWN in a NODE_ASN element.        */
-/* Parameters:                                                    */
-/*   node: element pointer.                                       */
-/*   down: pointer to a NODE_ASN element that you want be pointed */
-/*          by NODE.                                              */
-/* Return: pointer to *NODE.                                      */
-/******************************************************************/
-ASN1_TYPE
-_asn1_set_down (ASN1_TYPE node, ASN1_TYPE down)
-{
-  if (node == NULL)
-    return node;
-  node->down = down;
-  if (down)
-    down->left = node;
-  return node;
-}
-
-/******************************************************************/
-/* Function : _asn1_get_down                                      */
-/* Description: returns the element pointed by the DOWN field of  */
-/*              a NODE_ASN element.                               */
-/* Parameters:                                                    */
-/*   node: NODE_ASN element pointer.                              */
-/* Return: field DOWN of NODE.                                    */
-/******************************************************************/
-ASN1_TYPE
-_asn1_get_down (ASN1_TYPE node)
-{
-  if (node == NULL)
-    return NULL;
-  return node->down;
-}
-
-/******************************************************************/
-/* Function : _asn1_get_name                                      */
-/* Description: returns the name of a NODE_ASN element.           */
-/* Parameters:                                                    */
-/*   node: NODE_ASN element pointer.                              */
-/* Return: a null terminated string.                              */
-/******************************************************************/
-char *
-_asn1_get_name (ASN1_TYPE node)
-{
-  if (node == NULL)
-    return NULL;
-  return node->name;
-}
-
-/******************************************************************/
-/* Function : _asn1_mod_type                                      */
-/* Description: change the field TYPE of an NODE_ASN element.     */
-/*              The new value is the old one | (bitwise or) the   */
-/*              paramener VALUE.                                  */
-/* Parameters:                                                    */
-/*   node: NODE_ASN element pointer.                              */
-/*   value: the integer value that must be or-ed with the current */
-/*          value of field TYPE.                                  */
-/* Return: NODE pointer.                                          */
-/******************************************************************/
-ASN1_TYPE
-_asn1_mod_type (ASN1_TYPE node, unsigned int value)
-{
-  if (node == NULL)
-    return node;
-  node->type |= value;
-  return node;
-}
-
-
-/******************************************************************/
 /* Function : _asn1_remove_node                                   */
 /* Description: gets free the memory allocated for an NODE_ASN    */
 /*              element (not the elements pointed by it).         */
@@ -510,8 +414,6 @@ _asn1_remove_node (ASN1_TYPE node)
   if (node == NULL)
     return;
 
-  if (node->name != NULL)
-    _asn1_free (node->name);
   if (node->value != NULL && node->value != node->small_value)
     _asn1_free (node->value);
   _asn1_free (node);
index 374f599..7156088 100644 (file)
@@ -44,18 +44,8 @@ ASN1_TYPE _asn1_set_name (ASN1_TYPE node, const char *name);
 
 ASN1_TYPE _asn1_set_right (ASN1_TYPE node, ASN1_TYPE right);
 
-ASN1_TYPE _asn1_get_right (ASN1_TYPE node);
-
 ASN1_TYPE _asn1_get_last_right (ASN1_TYPE node);
 
-ASN1_TYPE _asn1_set_down (ASN1_TYPE node, ASN1_TYPE down);
-
-char *_asn1_get_name (ASN1_TYPE node);
-
-ASN1_TYPE _asn1_get_down (ASN1_TYPE node);
-
-ASN1_TYPE _asn1_mod_type (ASN1_TYPE node, unsigned int value);
-
 void _asn1_remove_node (ASN1_TYPE node);
 
 void _asn1_delete_list (void);
@@ -76,4 +66,91 @@ asn1_retCode _asn1_check_identifier (ASN1_TYPE node);
 
 asn1_retCode _asn1_set_default_tag (ASN1_TYPE node);
 
+/******************************************************************/
+/* Function : _asn1_get_right                                     */
+/* Description: returns the element pointed by the RIGHT field of */
+/*              a NODE_ASN element.                               */
+/* Parameters:                                                    */
+/*   node: NODE_ASN element pointer.                              */
+/* Return: field RIGHT of NODE.                                   */
+/******************************************************************/
+inline static ASN1_TYPE
+_asn1_get_right (ASN1_TYPE node)
+{
+  if (node == NULL)
+    return NULL;
+  return node->right;
+}
+
+/******************************************************************/
+/* Function : _asn1_set_down                                      */
+/* Description: sets the field DOWN in a NODE_ASN element.        */
+/* Parameters:                                                    */
+/*   node: element pointer.                                       */
+/*   down: pointer to a NODE_ASN element that you want be pointed */
+/*          by NODE.                                              */
+/* Return: pointer to *NODE.                                      */
+/******************************************************************/
+inline static ASN1_TYPE
+_asn1_set_down (ASN1_TYPE node, ASN1_TYPE down)
+{
+  if (node == NULL)
+    return node;
+  node->down = down;
+  if (down)
+    down->left = node;
+  return node;
+}
+
+/******************************************************************/
+/* Function : _asn1_get_down                                      */
+/* Description: returns the element pointed by the DOWN field of  */
+/*              a NODE_ASN element.                               */
+/* Parameters:                                                    */
+/*   node: NODE_ASN element pointer.                              */
+/* Return: field DOWN of NODE.                                    */
+/******************************************************************/
+inline static ASN1_TYPE
+_asn1_get_down (ASN1_TYPE node)
+{
+  if (node == NULL)
+    return NULL;
+  return node->down;
+}
+
+/******************************************************************/
+/* Function : _asn1_get_name                                      */
+/* Description: returns the name of a NODE_ASN element.           */
+/* Parameters:                                                    */
+/*   node: NODE_ASN element pointer.                              */
+/* Return: a null terminated string.                              */
+/******************************************************************/
+inline static char *
+_asn1_get_name (ASN1_TYPE node)
+{
+  if (node == NULL)
+    return NULL;
+  return node->name;
+}
+
+/******************************************************************/
+/* Function : _asn1_mod_type                                      */
+/* Description: change the field TYPE of an NODE_ASN element.     */
+/*              The new value is the old one | (bitwise or) the   */
+/*              paramener VALUE.                                  */
+/* Parameters:                                                    */
+/*   node: NODE_ASN element pointer.                              */
+/*   value: the integer value that must be or-ed with the current */
+/*          value of field TYPE.                                  */
+/* Return: NODE pointer.                                          */
+/******************************************************************/
+inline static ASN1_TYPE
+_asn1_mod_type (ASN1_TYPE node, unsigned int value)
+{
+  if (node == NULL)
+    return node;
+  node->type |= value;
+  return node;
+}
+
 #endif
index e4fe600..93da56c 100644 (file)
@@ -104,7 +104,7 @@ _asn1_create_static_structure (ASN1_TYPE pointer, char *output_file_name,
     {
       fprintf (file, "  { ");
 
-      if (p->name)
+      if (p->name[0] != 0)
        fprintf (file, "\"%s\", ", p->name);
       else
        fprintf (file, "NULL, ");
@@ -391,7 +391,7 @@ _asn1_copy_structure3 (ASN1_TYPE source_node)
     {
       if (move != UP)
        {
-         if (p_s->name)
+         if (p_s->name[0] != 0)
            _asn1_set_name (p_d, p_s->name);
          if (p_s->value)
            _asn1_set_value (p_d, p_s->value, p_s->value_len);
@@ -708,7 +708,7 @@ asn1_print_structure (FILE * out, ASN1_TYPE structure, const char *name,
          for (k = 0; k < indent; k++)
            fprintf (out, " ");
          fprintf (out, "name:");
-         if (p->name)
+         if (p->name[0] != 0)
            fprintf (out, "%s  ", p->name);
          else
            fprintf (out, "NULL  ");
@@ -725,7 +725,7 @@ asn1_print_structure (FILE * out, ASN1_TYPE structure, const char *name,
              for (k = 0; k < indent; k++)
                fprintf (out, " ");
              fprintf (out, "name:");
-             if (p->name)
+             if (p->name[0] != 0)
                fprintf (out, "%s  ", p->name);
              else
                fprintf (out, "NULL  ");
@@ -1067,7 +1067,7 @@ asn1_number_of_elements (ASN1_TYPE element, const char *name, int *num)
 
   while (p)
     {
-      if ((p->name) && (p->name[0] == '?'))
+      if (p->name[0] == '?')
        (*num)++;
       p = p->right;
     }