summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2008-11-08 08:56:57 -0500
committerSøren Sandmann <sandmann@redhat.com>2008-11-08 08:56:57 -0500
commitce69ed5fcb4697b30b5637cfaed5b3697051d79e (patch)
treeccb9be99abafee0940ec59b4a4ded0161351b21d /array.c
parentdd7708b8f2d6de7478787db33da76ef188efb6f9 (diff)
Implement some of the string methods; various cleanups
Diffstat (limited to 'array.c')
-rw-r--r--array.c101
1 files changed, 76 insertions, 25 deletions
diff --git a/array.c b/array.c
index 8a783ce..8f9cfa9 100644
--- a/array.c
+++ b/array.c
@@ -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)
{
+
}