[mod_ssi] produce content in subrequest hook
[lighttpd.git] / src / vector.h
blob7ba5dcf28cc734f9a518973e9342fb58184358a2
1 #ifndef LI_VECTOR_H
2 #define LI_VECTOR_H
3 #include "first.h"
5 #ifndef SIZE_MAX
6 # ifdef SIZE_T_MAX
7 # define SIZE_MAX SIZE_T_MAX
8 # else
9 # define SIZE_MAX ((size_t)~0)
10 # endif
11 #endif
13 #include <stdlib.h>
14 #include <string.h>
16 static inline size_t vector_align_size(size_t s) {
17 size_t a = (s + 16) & ((size_t)~15);
18 return (a < s) ? s : a;
21 void *vector_realloc(void *data, size_t elem_size, size_t size, size_t used);
23 #define DEFINE_TYPED_VECTOR(name, entry, release) \
24 typedef struct vector_ ## name { \
25 entry* data; \
26 size_t used; \
27 size_t size; \
28 } vector_ ## name; \
29 static inline void vector_ ## name ## _init(vector_ ## name *v) { \
30 v->data = NULL; \
31 v->used = v->size = 0; \
32 } \
33 static inline vector_ ## name *vector_ ## name ## _alloc() { \
34 vector_ ## name *v = malloc(sizeof(*v)); \
35 force_assert(NULL != v); \
36 vector_ ## name ## _init(v); \
37 return v; \
38 } \
39 static inline void vector_ ## name ## _clear(vector_ ## name *v) { \
40 size_t ndx; \
41 vector_ ## name vcopy = *v; \
42 vector_ ## name ## _init(v); \
43 if (release) for (ndx = 0; ndx < vcopy.used; ++ndx) release(vcopy.data[ndx]); \
44 free(vcopy.data); \
45 } \
46 static inline void vector_ ## name ## _free(vector_ ## name *v) { \
47 if (NULL != v) { \
48 vector_ ## name ## _clear(v); \
49 free(v); \
50 } \
51 } \
52 static inline void vector_ ## name ## _reserve(vector_ ## name *v, size_t p) { \
53 force_assert(v->used < SIZE_MAX - p); \
54 if (v->size < v->used + p) { \
55 v->size = vector_align_size(v->used + p); \
56 v->data = vector_realloc(v->data, sizeof(entry), v->size, v->used); \
57 } \
58 } \
59 static inline void vector_ ## name ## _push(vector_ ## name *v, entry e) { \
60 vector_ ## name ## _reserve(v, 1); \
61 v->data[v->used++] = e; \
62 } \
63 static inline entry vector_ ## name ## _pop(vector_ ## name *v) { \
64 force_assert(v->used > 0); \
65 return v->data[--v->used]; \
66 } \
67 struct vector_ ## name /* expect trailing semicolon */ \
68 /* end of DEFINE_TYPED_VECTOR */
70 #define DEFINE_TYPED_VECTOR_NO_RELEASE(name, entry) \
71 DEFINE_TYPED_VECTOR(name, entry, ((void(*)(entry)) NULL)) \
72 /* end of DEFINE_TYPED_VECTOR_NO_RELEASE */
75 #endif