]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Added new string functions to handle the XML string stuff.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sat, 22 Jun 2002 14:22:18 +0000 (14:22 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Sat, 22 Jun 2002 14:22:18 +0000 (14:22 +0000)
lib/gnutls_str.c
lib/gnutls_str.h
lib/x509_xml.c

index b6393d87b09e21fb353a8c601f32c9afaa026595..4d5a87fb1d9fd18a6c74053d5d614a04aa3a36aa 100644 (file)
@@ -22,6 +22,7 @@
 #include <gnutls_int.h>
 #include <gnutls_errors.h>
 #include <gnutls_num.h>
+#include <gnutls_str.h>
 
 /* These function are like strcat, strcpy. They only
  * do bound checking (they shouldn't cause buffer overruns),
@@ -67,3 +68,109 @@ void _gnutls_mem_cpy( char* dest, size_t dest_tot_size, const char* src, size_t
                }
        }
 }
+
+void _gnutls_string_init( gnutls_string* str, ALLOC_FUNC alloc_func, 
+       REALLOC_FUNC realloc_func,
+       FREE_FUNC free_func) 
+{
+       str->string = NULL;
+       str->max_length = 0;
+       str->length = 0;
+       
+       str->alloc_func = alloc_func;
+       str->free_func = free_func;
+       str->realloc_func = realloc_func;
+}
+
+void _gnutls_string_clear( gnutls_string* str)
+{
+       str->free_func( str->string);
+       memset( str, 0, sizeof( gnutls_string));
+}
+
+/* This one does not copy the string.
+ */
+gnutls_datum _gnutls_string2datum( gnutls_string* str)
+{
+       gnutls_datum ret;
+       
+       ret.data = str->string;
+       ret.size = str->length;
+       
+       return ret;
+}
+
+#define MIN_CHUNK 256
+
+int _gnutls_string_copy_str( gnutls_string* dest, const char * src)
+{
+       size_t src_len = strlen( src);
+       
+       if (dest->max_length >= src_len) {
+               memcpy( dest->string, src, src_len);
+               dest->length = src_len;
+               
+               return src_len;
+       } else {
+               dest->string = dest->realloc_func( dest->string, GMAX(src_len, MIN_CHUNK));
+               if (dest->string == NULL) {
+                       gnutls_assert();
+                       return GNUTLS_E_MEMORY_ERROR;
+               }
+               dest->max_length = GMAX( MIN_CHUNK, src_len);
+
+               memcpy( dest->string, src, src_len);
+               dest->length = src_len;
+               
+               return src_len;
+       }
+}
+
+int _gnutls_string_append_str( gnutls_string* dest, const char * src)
+{
+       size_t src_len = strlen( src);
+       size_t tot_len = src_len + dest->length;
+       
+       if (dest->max_length >= tot_len) {
+               memcpy( &dest->string[dest->length], src, src_len);
+               dest->length = tot_len;
+               
+               return tot_len;
+       } else {
+               dest->string = dest->realloc_func( dest->string, GMAX(tot_len, MIN_CHUNK));
+               if (dest->string == NULL) {
+                       gnutls_assert();
+                       return GNUTLS_E_MEMORY_ERROR;
+               }
+               dest->max_length = GMAX( MIN_CHUNK, tot_len);
+
+               memcpy( &dest->string[dest->length], src, src_len);
+               dest->length = tot_len;
+               
+               return tot_len;
+       }
+}
+
+int _gnutls_string_append_data( gnutls_string* dest, const void * data, size_t data_size)
+{
+       size_t tot_len = data_size + dest->length;
+       
+       if (dest->max_length >= tot_len) {
+               memcpy( &dest->string[dest->length], data, data_size);
+               dest->length = tot_len;
+               
+               return tot_len;
+       } else {
+               dest->string = dest->realloc_func( dest->string, GMAX(tot_len, MIN_CHUNK));
+               if (dest->string == NULL) {
+                       gnutls_assert();
+                       return GNUTLS_E_MEMORY_ERROR;
+               }
+               dest->max_length = GMAX( MIN_CHUNK, tot_len);
+
+               memcpy( &dest->string[dest->length], data, data_size);
+               dest->length = tot_len;
+               
+               return tot_len;
+       }
+}
index 55ed119dd9846134d951d578aacad034d24bce9a..bc8f1252edab0fcc36719dc97eab510792c06649 100644 (file)
@@ -1,3 +1,21 @@
+#include <gnutls_int.h>
+
 void _gnutls_str_cpy( char* dest, size_t dest_tot_size, const char* src);
 void _gnutls_mem_cpy( char* dest, size_t dest_tot_size, const char* src, size_t src_size);
 void _gnutls_str_cat( char* dest, size_t dest_tot_size, const char* src);
+
+typedef struct {
+       char * string;
+       size_t max_length;
+       size_t length;
+       REALLOC_FUNC realloc_func;
+       ALLOC_FUNC alloc_func;
+       FREE_FUNC free_func;
+} gnutls_string;
+
+void _gnutls_string_init( gnutls_string*, ALLOC_FUNC, REALLOC_FUNC, FREE_FUNC);
+void _gnutls_string_clear( gnutls_string*);
+gnutls_datum _gnutls_string2datum( gnutls_string* str);
+int _gnutls_string_copy_str( gnutls_string* dest, const char* src);
+int _gnutls_string_append_str( gnutls_string*, const char* str);
+int _gnutls_string_append_data( gnutls_string*, const void* data, size_t data_size);
index 09a937d8bcf2535bc42c8ec6785c584f671086b7..83af80d863ee585c0c1103c982a0ecd2b68c4509 100644 (file)
@@ -112,11 +112,11 @@ static int is_leaf(ASN1_TYPE p)
 
 }
 
-#define APPEND(y, z) if (_gnutls_datum_append_m( res, y, z, realloc) < 0) { \
+#define APPEND(y, z) if (_gnutls_string_append_data( &str, y, z) < 0) { \
                gnutls_assert(); \
                return GNUTLS_E_MEMORY_ERROR; \
        }
-#define STR_APPEND(y) if (_gnutls_datum_append_m( res, y, strlen(y), realloc) < 0) { \
+#define STR_APPEND(y) if (_gnutls_string_append_str( &str, y) < 0) { \
                gnutls_assert(); \
                return GNUTLS_E_MEMORY_ERROR; \
        }
@@ -180,14 +180,14 @@ _gnutls_asn1_get_structure_xml(ASN1_TYPE structure, char *name,
        opaque tmp[1024];
        char nname[256];
        int ret;
+       gnutls_string str;
 
        if (res == NULL || structure == NULL) {
                gnutls_assert();
                return GNUTLS_E_INVALID_PARAMETERS;
        }
-
-       res->data = NULL;
-       res->size = 0;
+       
+       _gnutls_string_init( &str, malloc, realloc, free);
 
        STR_APPEND(XML_HEADER);
 
@@ -554,6 +554,8 @@ _gnutls_asn1_get_structure_xml(ASN1_TYPE structure, char *name,
        
        APPEND( "\n\0", 2);
        
+       *res = _gnutls_string2datum( &str);
+       
        return 0;
 }