Added support for user specified SilcStack.
authorPekka Riikonen <priikone@silcnet.org>
Tue, 3 Jul 2007 19:47:45 +0000 (19:47 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Tue, 3 Jul 2007 19:47:45 +0000 (19:47 +0000)
lib/silcasn1/silcasn1.c
lib/silcasn1/silcasn1.h
lib/silcasn1/tests/test_silcasn1.c

index 5965228be1990640b2e4adf16578f2502d362f77..c1ec3bb45e1a5ffc62372c86355174576e6c4cb0 100644 (file)
 
 /* Allocate ASN.1 context. */
 
-SilcAsn1 silc_asn1_alloc(void)
+SilcAsn1 silc_asn1_alloc(SilcStack stack)
 {
-  SilcAsn1 asn1 = silc_calloc(1, sizeof(*asn1));
-  if (!asn1)
+  SilcAsn1 asn1;
+  SilcStack stack1;
+
+  stack1 = silc_stack_alloc(0, stack);
+  if (!stack1)
     return NULL;
 
-  if (!silc_asn1_init(asn1))
+  /* Allocate itself from the stack */
+  asn1 = silc_scalloc(stack1, 1, sizeof(*asn1));
+  if (!asn1) {
+    silc_stack_free(stack1);
+    return NULL;
+  }
+
+  asn1->stack1 = stack1;
+  asn1->stack2 = silc_stack_alloc(0, stack);
+  if (!asn1->stack2) {
+    silc_stack_free(stack1);
     return NULL;
+  }
+
+  asn1->accumul = 0;
 
   return asn1;
 }
@@ -40,20 +56,19 @@ SilcAsn1 silc_asn1_alloc(void)
 void silc_asn1_free(SilcAsn1 asn1)
 {
   silc_asn1_uninit(asn1);
-  silc_free(asn1);
 }
 
 /* Init pre-allocated ASN.1 context */
 
-SilcBool silc_asn1_init(SilcAsn1 asn1)
+SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack)
 {
-  asn1->stack1 = silc_stack_alloc(768);
+  asn1->stack1 = silc_stack_alloc(0, stack);
   if (!asn1->stack1)
     return FALSE;
 
-  asn1->stack2 = silc_stack_alloc(768);
+  asn1->stack2 = silc_stack_alloc(0, stack);
   if (!asn1->stack2) {
-    silc_stack_free(asn1->stack2);
+    silc_stack_free(asn1->stack1);
     return FALSE;
   }
 
@@ -66,8 +81,8 @@ SilcBool silc_asn1_init(SilcAsn1 asn1)
 
 void silc_asn1_uninit(SilcAsn1 asn1)
 {
-  silc_stack_free(asn1->stack1);
   silc_stack_free(asn1->stack2);
+  silc_stack_free(asn1->stack1);
 }
 
 #if defined(SILC_DEBUG)
index df5bde14dab3319be604476d40de1647c15985f5..6ee70bbbb6164943c7e419949b3ce305c7ee5080 100644 (file)
@@ -201,13 +201,14 @@ typedef enum {
  *
  * SYNOPSIS
  *
- *    SilcAsn1 silc_asn1_alloc(void);
+ *    SilcAsn1 silc_asn1_alloc(SilcStack stack);
  *
  * DESCRIPTION
  *
  *    Allocates and initializes ASN.1 encoder/decoder and returns SilcAsn1
  *    context or NULL on error.  This context can be used with both
- *    silc_asn1_encode and silc_asn1_decode functions.
+ *    silc_asn1_encode and silc_asn1_decode functions.  If `stack' is non-NULL
+ *    all memory will be allocated from `stack'.
  *
  *    Usually SilcAsn1 is allocated when encoder or decoder is needed,
  *    however it is also possible to allocate long-lasting SilcAsn1 and
@@ -220,7 +221,7 @@ typedef enum {
  *    data that is returned by silc_asn1_decode function becomes invalid.
  *
  ***/
-SilcAsn1 silc_asn1_alloc(void);
+SilcAsn1 silc_asn1_alloc(SilcStack stack);
 
 /****f* silcasn1/SilcASN1API/silc_asn1_free
  *
@@ -241,7 +242,7 @@ void silc_asn1_free(SilcAsn1 asn1);
  *
  * SYNOPSIS
  *
- *    SilcBool silc_asn1_init(SilcAsn1 asn1);
+ *    SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack);
  *
  * DESCRIPTION
  *
@@ -252,11 +253,11 @@ void silc_asn1_free(SilcAsn1 asn1);
  * EXAMPLE
  *
  *    SilcAsn1Struct asn1;
- *    if (!silc_asn1_init(&asn1))
+ *    if (!silc_asn1_init(&asn1, NULL))
  *      error;
  *
  ***/
-SilcBool silc_asn1_init(SilcAsn1 asn1);
+SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack);
 
 /****f* silcasn1/SilcASN1API/silc_asn1_uninit
  *
index 74bd8c807f142bdb34d1c1c4fc3c8c62f237c6e1..b3c5e9154ad90d62430fc264557a2ee3c8576c07 100644 (file)
@@ -55,6 +55,7 @@ int main(int argc, char **argv)
   char tmp[32];
   SilcRng rng;
   SilcMPInt mpint, mpint2;
+  SilcStack stack;
 
   memset(&node, 0, sizeof(node));
   memset(&node2, 0, sizeof(node2));
@@ -62,15 +63,17 @@ int main(int argc, char **argv)
   if (argc > 1 && !strcmp(argv[1], "-d")) {
     silc_log_debug(TRUE);
     silc_log_debug_hexdump(TRUE);
-    silc_log_set_debug_string("*asn1*,*ber*");
+    silc_log_set_debug_string("*asn1*,*ber*,*stack*");
   }
 
   silc_hash_register_default();
   rng = silc_rng_alloc();
   silc_rng_init(rng);
 
+  stack = silc_stack_alloc(0, NULL);
+
   SILC_LOG_DEBUG(("Allocating ASN.1 context"));
-  asn1 = silc_asn1_alloc();
+  asn1 = silc_asn1_alloc(stack);
   if (!asn1)
     goto out;
 
@@ -744,6 +747,9 @@ int main(int argc, char **argv)
 
 #endif /* 1 */
   silc_asn1_free(asn1);
+  silc_rng_free(rng);
+  silc_hash_unregister_all();
+  silc_stack_free(stack);
 
   success = TRUE;
  out: