[xbuild] Fix bug #676671. Raise AnyEvent .
[mono.git] / eglib / src / gbytearray.c
1 /*
2  * Arrays
3  *
4  * Author:
5  *   Geoff Norton  (gnorton@novell.com)
6  *
7  * (C) 2010 Novell, Inc.
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining
10  * a copy of this software and associated documentation files (the
11  * "Software"), to deal in the Software without restriction, including
12  * without limitation the rights to use, copy, modify, merge, publish,
13  * distribute, sublicense, and/or sell copies of the Software, and to
14  * permit persons to whom the Software is furnished to do so, subject to
15  * the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be
18  * included in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27  */
28
29 #include <stdlib.h>
30 #include <glib.h>
31
32 #define INITIAL_CAPACITY 16
33
34 static void
35 ensure_capacity (GByteArray *array,
36                  int capacity)
37 {
38         int new_capacity = MAX (array->len, INITIAL_CAPACITY);
39
40         if (capacity < array->len)
41                 return;
42
43         while (new_capacity < capacity) {
44                 new_capacity <<= 1;
45         }
46         capacity = new_capacity;
47         array->data = (guint8*) g_realloc (array->data, capacity);
48
49         memset (array->data + array->len, 0, capacity - array->len);
50         array->len = capacity;
51 }
52
53 GByteArray *
54 g_byte_array_new ()
55 {
56         GByteArray *rv = g_new0 (GByteArray, 1);
57
58         ensure_capacity (rv, INITIAL_CAPACITY);
59
60         return rv;
61 }
62
63 guint8*
64 g_byte_array_free (GByteArray *array,
65               gboolean free_segment)
66 {
67         guint8* rv = NULL;
68
69         g_return_val_if_fail (array != NULL, NULL);
70
71         if (free_segment)
72                 g_free (array->data);
73         else
74                 rv = array->data;
75
76         g_free (array);
77
78         return rv;
79 }
80
81 GByteArray *
82 g_array_append (GByteArray *array,
83                      guint8 *data,
84                      guint len)
85 {
86         g_return_val_if_fail (array != NULL, NULL);
87
88         ensure_capacity (array, array->len + len);
89   
90         memmove (array->data + array->len, data, len);
91
92         array->len += len;
93
94         return array;
95 }