summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2009-04-02 14:00:18 -0400
committerSøren Sandmann <sandmann@redhat.com>2009-04-02 14:00:18 -0400
commit98a8963ee6c5c38a19cfd23dcd596b8b5e09a348 (patch)
treed4a50d70a43ac22d1cdf5020f47c9d2f12e344b4 /array.c
parent72813fba0400d4b8abf370fded95b0d7164e08b8 (diff)
Add epoll.[ch]
Diffstat (limited to 'array.c')
-rw-r--r--array.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/array.c b/array.c
index 2bd6ab2..1999992 100644
--- a/array.c
+++ b/array.c
@@ -86,7 +86,7 @@ realloc_array (array_t *array, int n_elements)
pot = 1;
while (pot < n_bytes)
pot *= 2;
-
+
array = g_realloc (array, pot);
array->n_bytes = pot;
@@ -112,13 +112,20 @@ array_new (int element_size, const int *magic)
}
static array_t *
-array_delete_head (array_t *array, int n_elements)
+array_delete_head (array_t *array, gssize n_elements)
{
int n_bytes = n_elements * array->element_size;
+ int n_total = array->n_elements * array->element_size;
+
+ if (n_elements < 0 || n_elements > array->n_elements)
+ n_bytes = n_total;
/* FIXME: this should be done in constant time */
- memmove (array->data, (char *)array->data + n_bytes, n_bytes);
+ memmove (array->data, (char *)array->data + n_bytes, n_total - n_bytes);
+
+ array->n_elements -= n_elements;
+
nul_terminate (array);
return array;
@@ -128,7 +135,6 @@ static array_t *
array_delete_tail (array_t *array, int n_elements)
{
array->n_elements -= n_elements;
-
nul_terminate (array);
return array;
@@ -245,10 +251,12 @@ nul_string_append_undefined (nul_string_t *str,
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;
+ array->n_elements += n_bytes;
+ str = (nul_string_t *)array->data;
+
str[array->n_elements] = '\0';
if (tail)
@@ -265,7 +273,7 @@ nul_string_append (nul_string_t *str,
char *tail;
str = nul_string_append_undefined (str, n_bytes, &tail);
-
+
memcpy (tail, bytes, n_bytes);
return str;
@@ -354,7 +362,7 @@ nul_buffer_get_length (nul_buffer_t *buffer)
nul_string_t *
nul_buffer_free (nul_buffer_t *buffer,
- gboolean free_data)
+ gboolean free_data)
{
char *result;
@@ -367,6 +375,8 @@ nul_buffer_free (nul_buffer_t *buffer,
{
result = buffer->data;
}
+
+ g_free (buffer);
return result;
}
@@ -484,7 +494,7 @@ nul_buffer_swap_content (nul_buffer_t *buffer1,
{
nul_string_t *tmp;
- tmp = buffer1->data;
+ tmp = buffer2->data;
buffer2->data = buffer1->data;
buffer1->data = tmp;
}