示例#1
0
文件: array.c 项目: moon2l/ironbee
ib_status_t ib_array_setn(ib_array_t *arr, size_t idx, void *val)
{
    IB_FTRACE_INIT();
    size_t r, c;
    void **data;

    /* Keep extending by ninit elements until the index fits in the array. */
    while (idx >= arr->size) {
        r = arr->size / arr->ninit;

        /* If this will exceed the max, then reallocate the extents
         * to double its previous value to make room.
         */
        if (r >= arr->nextents) {
            void *new_extents = (void *)ib_mpool_calloc(arr->mp,
                                                            arr->nextents * 2,
                                                            sizeof(void *));
            if (new_extents == NULL) {
                IB_FTRACE_RET_STATUS(IB_EALLOC);
            }
            memcpy(new_extents, arr->extents, sizeof(void *) * arr->nextents);
            arr->extents = new_extents;
            arr->nextents *= 2;
        }

        ((void ***)arr->extents)[r] = (void **)ib_mpool_calloc(arr->mp,
            arr->ninit, sizeof(void *)
        );
        arr->size += arr->ninit;
    }

    /* Calculate the row/column where the data resides. */
    r = IB_ARRAY_EXTENT_INDEX(arr, idx);
    c = IB_ARRAY_DATA_INDEX(arr, idx, r);

    data = ((void ***)arr->extents)[r];
    data[c] = val;

    /* Keep track of the number of elements stored. */
    if (idx >= arr->nelts) {
        arr->nelts = idx + 1;
    }

    IB_FTRACE_RET_STATUS(IB_OK);
}
示例#2
0
文件: array.c 项目: aburan28/ironbee
ib_status_t ib_array_get(ib_array_t *arr, size_t idx, void *pval)
{
    size_t r, c;
    void **data;

    if (idx >= arr->nelts) {
        *(void **)pval = NULL;
        return IB_EINVAL;
    }

    /* Calculate the row/column where the data resides. */
    r = IB_ARRAY_EXTENT_INDEX(arr, idx);
    c = IB_ARRAY_DATA_INDEX(arr, idx, r);

    data = ((void ***)arr->extents)[r];
    *(void **)pval = data[c];

    return IB_OK;
}
示例#3
0
文件: array.c 项目: niq/ironbee
ib_status_t ib_array_get(ib_array_t *arr, size_t idx, void *pval)
{
    IB_FTRACE_INIT(ib_array_get);
    size_t r, c;
    void **data;

    if (idx >= arr->nelts) {
        *(void **)pval = NULL;
        IB_FTRACE_RET_STATUS(IB_EINVAL);
    }

    /* Calculate the row/column where the data resides. */
    r = IB_ARRAY_EXTENT_INDEX(arr, idx);
    c = IB_ARRAY_DATA_INDEX(arr, idx, r);

    data = ((void ***)arr->extents)[r];
    *(void **)pval = data[c];

    IB_FTRACE_RET_STATUS(IB_OK);
}