diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2002-06-22 14:22:18 +0000 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2002-06-22 14:22:18 +0000 |
commit | f2ea2f1c95bc0fafdc51ac818cc0dd9546607cf2 (patch) | |
tree | 15ef35122d04e2d52a3fdbb91e146eb801b336f8 | |
parent | 0645ff56014b339af354ff097dc245c9723e29a0 (diff) | |
download | gnutls-f2ea2f1c95bc0fafdc51ac818cc0dd9546607cf2.tar.gz |
Added new string functions to handle the XML string stuff.
-rw-r--r-- | lib/gnutls_str.c | 107 | ||||
-rw-r--r-- | lib/gnutls_str.h | 18 | ||||
-rw-r--r-- | lib/x509_xml.c | 12 |
3 files changed, 132 insertions, 5 deletions
diff --git a/lib/gnutls_str.c b/lib/gnutls_str.c index b6393d87b0..4d5a87fb1d 100644 --- a/lib/gnutls_str.c +++ b/lib/gnutls_str.c @@ -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; + } +} diff --git a/lib/gnutls_str.h b/lib/gnutls_str.h index 55ed119dd9..bc8f1252ed 100644 --- a/lib/gnutls_str.h +++ b/lib/gnutls_str.h @@ -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); diff --git a/lib/x509_xml.c b/lib/x509_xml.c index 09a937d8bc..83af80d863 100644 --- a/lib/x509_xml.c +++ b/lib/x509_xml.c @@ -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; } |