|  | 
 | /* | 
 |  * Copyright (C) Igor Sysoev | 
 |  */ | 
 |  | 
 |  | 
 | #include <ngx_config.h> | 
 | #include <ngx_core.h> | 
 |  | 
 |  | 
 | ngx_list_t * | 
 | ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size) | 
 | { | 
 |     ngx_list_t  *list; | 
 |  | 
 |     list = ngx_palloc(pool, sizeof(ngx_list_t)); | 
 |     if (list == NULL) { | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     list->part.elts = ngx_palloc(pool, n * size); | 
 |     if (list->part.elts == NULL) { | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     list->part.nelts = 0; | 
 |     list->part.next = NULL; | 
 |     list->last = &list->part; | 
 |     list->size = size; | 
 |     list->nalloc = n; | 
 |     list->pool = pool; | 
 |  | 
 |     return list; | 
 | } | 
 |  | 
 |  | 
 | void * | 
 | ngx_list_push(ngx_list_t *l) | 
 | { | 
 |     void             *elt; | 
 |     ngx_list_part_t  *last; | 
 |  | 
 |     last = l->last; | 
 |  | 
 |     if (last->nelts == l->nalloc) { | 
 |  | 
 |         /* the last part is full, allocate a new list part */ | 
 |  | 
 |         last = ngx_palloc(l->pool, sizeof(ngx_list_part_t)); | 
 |         if (last == NULL) { | 
 |             return NULL; | 
 |         } | 
 |  | 
 |         last->elts = ngx_palloc(l->pool, l->nalloc * l->size); | 
 |         if (last->elts == NULL) { | 
 |             return NULL; | 
 |         } | 
 |  | 
 |         last->nelts = 0; | 
 |         last->next = NULL; | 
 |  | 
 |         l->last->next = last; | 
 |         l->last = last; | 
 |     } | 
 |  | 
 |     elt = (char *) last->elts + l->size * last->nelts; | 
 |     last->nelts++; | 
 |  | 
 |     return elt; | 
 | } |