diff options
author | Søren Sandmann <sandmann@redhat.com> | 2008-11-08 08:56:57 -0500 |
---|---|---|
committer | Søren Sandmann <sandmann@redhat.com> | 2008-11-08 08:56:57 -0500 |
commit | ce69ed5fcb4697b30b5637cfaed5b3697051d79e (patch) | |
tree | ccb9be99abafee0940ec59b4a4ded0161351b21d /array.c | |
parent | dd7708b8f2d6de7478787db33da76ef188efb6f9 (diff) |
Implement some of the string methods; various cleanups
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 101 |
1 files changed, 76 insertions, 25 deletions
@@ -16,6 +16,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <string.h> +#include <glib/gprintf.h> #include "libnul.h" /* General array implementation */ @@ -44,7 +45,7 @@ struct array_t }; static inline array_t * -get_array (void *data, const int *magic) +get_array (const void *data, const int *magic) { array_t *array; @@ -63,8 +64,8 @@ array_free (array_t *array, const int *magic) g_free (array); } -static array_t * -realloc_array (array_t *array, int n_elements) +static array_t * G_GNUC_WARN_UNUSED_RESULT +realloc_array (array_t *array, int n_elements) { gssize n_bytes; @@ -149,13 +150,13 @@ struct parr_t static const int parr_t_magic; void ** -nul_parr_new (void) +nul_ptr_array_new (void) { return array_new (sizeof (void *), &parr_t_magic); } void ** -nul_parr_append (void **arr, gpointer data) +nul_ptr_array_append (void **arr, gpointer data) { array_t *array = get_array (arr, &parr_t_magic); @@ -170,72 +171,121 @@ nul_parr_append (void **arr, gpointer data) } void -nul_parr_free (void **arr) +nul_ptr_array_free (void **arr) { array_free (get_array (arr, &parr_t_magic), &parr_t_magic); } gsize -nul_parr_len (void **arr) +nul_ptr_array_len (void *const *arr) { - array_t *array = get_array (arr, &parr_t_magic); - - return array->n_elements; + return get_array (arr, &parr_t_magic)->n_elements; } -/* Strings */ +/* + * Strings + */ +static const int string_t_magic; + nul_string_t * nul_string_new (void) { + return array_new (sizeof (char), &string_t_magic); } void -nul_string_free (void) +nul_string_free (nul_string_t *str) { + array_free (get_array (str, &string_t_magic), &string_t_magic); } gsize -nul_string_len (const nul_string_t *str) +nul_string_len (const nul_string_t *str) { + return get_array (str, &string_t_magic)->n_elements; } gboolean -nul_string_empty (const nul_string_t *str) +nul_string_empty (const nul_string_t *str) { + return nul_string_len (str) == 0; } -nul_string_t * -nul_string_append_undefined (nul_string_t *string, +static nul_string_t * +string_nul_terminate (nul_string_t *str) +{ + array_t *array = get_array (str, &string_t_magic); + + str[array->n_elements] = 0; + + return str; +} + +nul_string_t * G_GNUC_WARN_UNUSED_RESULT +nul_string_append_undefined (nul_string_t *str, gsize n_bytes, char **tail) { + array_t *array = get_array (str, &string_t_magic); + + array = realloc_array (array, array->n_elements + n_bytes); + str = (nul_string_t *)array->data; + + str[array->n_elements] = '\0'; + + if (tail) + *tail = str + array->n_elements - n_bytes; + + return str; } nul_string_t * -nul_string_append (nul_string_t *string, +nul_string_append (nul_string_t *str, const char *bytes, gssize n_bytes) { + char *tail; + + str = nul_string_append_undefined (str, n_bytes, &tail); + + memcpy (tail, bytes, n_bytes); + + return str; } nul_string_t * -nul_string_append_printf (nul_string_t *string, +nul_string_append_printf (nul_string_t *str, const char *fmt, ...) { + va_list args; + + g_return_val_if_fail (fmt != NULL, NULL); + + va_start (args, fmt); + + str = nul_string_append_vprintf (str, fmt, args); + + va_end (args); + + return str; } nul_string_t * -nul_string_append_vprintf (nul_string_t *string, +nul_string_append_vprintf (nul_string_t *str, const char *fmt, va_list args) { -} - -void -nul_string_swap (nul_string_t **str1, - nul_string_t **str2) -{ + gsize required; + gchar *buffer; + + required = g_vsnprintf (NULL, 0, fmt, args); + + str = nul_string_append_undefined (str, required, &buffer); + + g_vsprintf (buffer, fmt, args); + + return str; } void @@ -255,4 +305,5 @@ nul_string_t * nul_string_delete_tail (nul_string_t *str, gsize n_bytes) { + } |