summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2002-06-22 14:22:18 +0000
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2002-06-22 14:22:18 +0000
commitf2ea2f1c95bc0fafdc51ac818cc0dd9546607cf2 (patch)
tree15ef35122d04e2d52a3fdbb91e146eb801b336f8
parent0645ff56014b339af354ff097dc245c9723e29a0 (diff)
downloadgnutls-f2ea2f1c95bc0fafdc51ac818cc0dd9546607cf2.tar.gz
Added new string functions to handle the XML string stuff.
-rw-r--r--lib/gnutls_str.c107
-rw-r--r--lib/gnutls_str.h18
-rw-r--r--lib/x509_xml.c12
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;
}