diff options
author | Igor Sysoev <igor@sysoev.ru> | 2002-08-06 20:39:45 +0400 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2002-08-06 20:39:45 +0400 |
commit | 6de5c2cb63f8aee4bcbec3c363a72fd8e4a4e64d (patch) | |
tree | 0e4da305f8101799b6c6aa3002cecf539c2578c0 /src/core/ngx_array.c |
nginx-0.0.1-2002-08-06-20:39:45 import
The first code that uses "ngx_" prefix, the previous one used "gx_" prefix.
At that point the code is not yet usable. The first draft ideas are dated
back to 23.10.2001.
Diffstat (limited to 'src/core/ngx_array.c')
-rw-r--r-- | src/core/ngx_array.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/core/ngx_array.c b/src/core/ngx_array.c new file mode 100644 index 000000000..08ad5887b --- /dev/null +++ b/src/core/ngx_array.c @@ -0,0 +1,69 @@ + +#include <ngx_config.h> + +#include <ngx_alloc.h> +#include <ngx_array.h> + +ngx_array_t *ngx_create_array(ngx_pool_t *p, int n, size_t size) +{ + ngx_array_t *a; + + a = ngx_palloc(p, sizeof(ngx_array_t)); + if (a == NULL) + return NULL; + + a->elts = ngx_palloc(p, n * size); + if (a->elts == NULL) + return NULL; + + a->pool = p; + a->nelts = 0; + a->nalloc = n; + a->size = size; + + return a; +} + +void ngx_destroy_array(ngx_array_t *a) +{ + ngx_pool_t *p = a->pool; + + if (a->elts + a->size * a->nalloc == p->last) + p->last -= a->size * a->nalloc; + + if ((char *) a + sizeof(ngx_array_t) == p->last) + p->last = (char *) a; +} + +void *ngx_push_array(ngx_array_t *a) +{ + void *elt; + + /* array is full */ + if (a->nelts == a->nalloc) { + ngx_pool_t *p = a->pool; + + /* array allocation is the last in the pool */ + if (a->elts + a->size * a->nelts == p->last + && (unsigned) (p->end - p->last) >= a->size) + { + p->last += a->size; + a->nalloc++; + + /* allocate new array */ + } else { + void *new = ngx_palloc(p, 2 * a->nalloc * a->size); + if (new == NULL) + return NULL; + + memcpy(new, a->elts, a->nalloc * a->size); + a->elts = new; + a->nalloc *= 2; + } + } + + elt = a->elts + a->size * a->nelts; + a->nelts++; + + return elt; +} |