csi_status_t _csi_stack_grow (csi_t *ctx, csi_stack_t *stack, csi_integer_t cnt) { csi_integer_t newsize; csi_object_t *newstack; if (_csi_likely (cnt <= stack->size)) return CSI_STATUS_SUCCESS; if (_csi_unlikely ((unsigned) cnt >= INT_MAX / sizeof (csi_object_t))) return _csi_error (CSI_STATUS_NO_MEMORY); newsize = stack->size; do { newsize *= 2; } while (newsize <= cnt); newstack = _csi_realloc (ctx, stack->objects, newsize * sizeof (csi_object_t)); if (_csi_unlikely (newstack == NULL)) return _csi_error (CSI_STATUS_NO_MEMORY); stack->objects = newstack; stack->size = newsize; return CSI_STATUS_SUCCESS; }
void * _csi_alloc0 (csi_t *ctx, int size) { void *ptr; ptr = _csi_alloc (ctx, size); if (_csi_likely (ptr != NULL)) memset (ptr, 0, size); return ptr; }