#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),
}
}
}
+
+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;
+ }
+}
+#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);
}
-#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; \
}
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);
APPEND( "\n\0", 2);
+ *res = _gnutls_string2datum( &str);
+
return 0;
}