folly::coro::timeoutNoDiscard
[hiphop-php.git] / hphp / neo / ulist.c
blob0800782bf75137032ea3ab1f765766cd676c7c12
1 /*
2 * Copyright 2001-2004 Brandon Long
3 * All Rights Reserved.
5 * ClearSilver Templating System
7 * This code is made available under the terms of the ClearSilver License.
8 * http://www.clearsilver.net/license.hdf
12 #include "cs_config.h"
14 #include <stdlib.h>
15 #include <string.h>
16 #include <errno.h>
18 #include "neo_misc.h"
19 #include "neo_err.h"
20 #include "ulist.h"
22 #define ULIST_DEFAULT_SIZE 10
24 static NEOERR *check_resize (ULIST *ul, int size)
26 if (size > ul->max)
28 void **new_items;
29 int new_size = 0;
31 new_size = ul->max*2;
32 if (size > new_size)
34 new_size = size + ul->max;
37 new_items = (void **) realloc ((void *)(ul->items), new_size * sizeof(void *));
38 if (new_items == NULL)
40 return nerr_raise(NERR_NOMEM,
41 "Unable to resize ULIST to %d: Out of memory", new_size);
43 ul->items = new_items;
44 ul->max = new_size;
47 return STATUS_OK;
51 NEOERR *uListInit(ULIST **ul, int size, int flags)
53 ULIST *r_ul;
55 *ul = NULL;
56 if (size == 0)
58 size = ULIST_DEFAULT_SIZE;
61 r_ul = (ULIST *) calloc (1, sizeof (ULIST));
62 if (r_ul == NULL)
64 return nerr_raise(NERR_NOMEM, "Unable to create ULIST: Out of memory");
66 r_ul->items = (void **) calloc (size, sizeof(void *));
67 if (r_ul->items == NULL)
69 free (r_ul);
70 return nerr_raise(NERR_NOMEM, "Unable to create ULIST: Out of memory");
73 r_ul->num = 0;
74 r_ul->max = size;
75 r_ul->flags = flags;
76 *ul = r_ul;
78 return STATUS_OK;
81 NEOERR *uListAppend (ULIST *ul, void *data)
83 NEOERR *r;
85 r = check_resize (ul, ul->num + 1);
86 if (r != STATUS_OK)
87 return r;
89 ul->items[ul->num] = data;
90 ul->num++;
92 return STATUS_OK;
95 NEOERR *uListGet (ULIST *ul, int x, void **data)
97 if (x < 0)
98 x = ul->num + x;
100 if (x >= ul->num)
101 return nerr_raise(NERR_OUTOFRANGE, "uListGet: past end (%d > %d)",
102 x, ul->num);
104 if (x < 0)
105 return nerr_raise(NERR_OUTOFRANGE, "uListGet: past beginning (%d < 0)", x);
107 *data = ul->items[x];
109 return STATUS_OK;
112 NEOERR *uListSort (ULIST *ul, int (*compareFunc)(const void *, const void*)) {
113 qsort(ul->items, ul->num, sizeof(void *), compareFunc);
114 return STATUS_OK;
117 NEOERR *uListDestroy (ULIST **ul, int flags)
119 if (flags & ULIST_FREE)
121 return uListDestroyFunc(ul, free);
123 else
125 return uListDestroyFunc(ul, NULL);
129 NEOERR *uListDestroyFunc (ULIST **ul, void (*destroyFunc)(void *))
131 ULIST *r_ul;
133 r_ul = *ul;
135 if (r_ul == NULL)
136 return STATUS_OK;
138 if (destroyFunc != NULL)
140 int x;
141 for (x = 0; x < r_ul->num; x++)
143 (*destroyFunc)(r_ul->items[x]);
146 free (r_ul->items);
147 free (r_ul);
148 *ul = NULL;
150 return STATUS_OK;
153 int uListLength (ULIST *ul)
155 if (ul == NULL) return 0;
156 return ul->num;