Annotation of embedaddon/php/Zend/zend_stack.c, revision 1.1

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | Zend Engine                                                          |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
        !             6:    +----------------------------------------------------------------------+
        !             7:    | This source file is subject to version 2.00 of the Zend license,     |
        !             8:    | that is bundled with this package in the file LICENSE, and is        | 
        !             9:    | available through the world-wide-web at the following url:           |
        !            10:    | http://www.zend.com/license/2_00.txt.                                |
        !            11:    | If you did not receive a copy of the Zend license and are unable to  |
        !            12:    | obtain it through the world-wide-web, please send a note to          |
        !            13:    | license@zend.com so we can mail you a copy immediately.              |
        !            14:    +----------------------------------------------------------------------+
        !            15:    | Authors: Andi Gutmans <andi@zend.com>                                |
        !            16:    |          Zeev Suraski <zeev@zend.com>                                |
        !            17:    +----------------------------------------------------------------------+
        !            18: */
        !            19: 
        !            20: /* $Id: zend_stack.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            21: 
        !            22: #include "zend.h"
        !            23: #include "zend_stack.h"
        !            24: 
        !            25: ZEND_API int zend_stack_init(zend_stack *stack)
        !            26: {
        !            27:        stack->top = 0;
        !            28:        stack->elements = (void **) emalloc(sizeof(void **) * STACK_BLOCK_SIZE);
        !            29:        if (!stack->elements) {
        !            30:                return FAILURE;
        !            31:        } else {
        !            32:                stack->max = STACK_BLOCK_SIZE;
        !            33:                return SUCCESS;
        !            34:        }
        !            35: }
        !            36: 
        !            37: ZEND_API int zend_stack_push(zend_stack *stack, const void *element, int size)
        !            38: {
        !            39:        if (stack->top >= stack->max) {         /* we need to allocate more memory */
        !            40:                stack->elements = (void **) erealloc(stack->elements,
        !            41:                                   (sizeof(void **) * (stack->max += STACK_BLOCK_SIZE)));
        !            42:                if (!stack->elements) {
        !            43:                        return FAILURE;
        !            44:                }
        !            45:        }
        !            46:        stack->elements[stack->top] = (void *) emalloc(size);
        !            47:        memcpy(stack->elements[stack->top], element, size);
        !            48:        return stack->top++;
        !            49: }
        !            50: 
        !            51: 
        !            52: ZEND_API int zend_stack_top(const zend_stack *stack, void **element)
        !            53: {
        !            54:        if (stack->top > 0) {
        !            55:                *element = stack->elements[stack->top - 1];
        !            56:                return SUCCESS;
        !            57:        } else {
        !            58:                *element = NULL;
        !            59:                return FAILURE;
        !            60:        }
        !            61: }
        !            62: 
        !            63: 
        !            64: ZEND_API int zend_stack_del_top(zend_stack *stack)
        !            65: {
        !            66:        if (stack->top > 0) {
        !            67:                efree(stack->elements[--stack->top]);
        !            68:        }
        !            69:        return SUCCESS;
        !            70: }
        !            71: 
        !            72: 
        !            73: ZEND_API int zend_stack_int_top(const zend_stack *stack)
        !            74: {
        !            75:        int *e;
        !            76: 
        !            77:        if (zend_stack_top(stack, (void **) &e) == FAILURE) {
        !            78:                return FAILURE;                 /* this must be a negative number, since negative numbers can't be address numbers */
        !            79:        } else {
        !            80:                return *e;
        !            81:        }
        !            82: }
        !            83: 
        !            84: 
        !            85: ZEND_API int zend_stack_is_empty(const zend_stack *stack)
        !            86: {
        !            87:        if (stack->top == 0) {
        !            88:                return 1;
        !            89:        } else {
        !            90:                return 0;
        !            91:        }
        !            92: }
        !            93: 
        !            94: 
        !            95: ZEND_API int zend_stack_destroy(zend_stack *stack)
        !            96: {
        !            97:        int i;
        !            98: 
        !            99:        if (stack->elements) {
        !           100:                for (i = 0; i < stack->top; i++) {
        !           101:                        efree(stack->elements[i]);
        !           102:                }
        !           103: 
        !           104:                efree(stack->elements);
        !           105:        }
        !           106: 
        !           107:        return SUCCESS;
        !           108: }
        !           109: 
        !           110: 
        !           111: ZEND_API void **zend_stack_base(const zend_stack *stack)
        !           112: {
        !           113:        return stack->elements;
        !           114: }
        !           115: 
        !           116: 
        !           117: ZEND_API int zend_stack_count(const zend_stack *stack)
        !           118: {
        !           119:        return stack->top;
        !           120: }
        !           121: 
        !           122: 
        !           123: ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function)(void *element))
        !           124: {
        !           125:        int i;
        !           126: 
        !           127:        switch (type) {
        !           128:                case ZEND_STACK_APPLY_TOPDOWN:
        !           129:                        for (i=stack->top-1; i>=0; i--) {
        !           130:                                if (apply_function(stack->elements[i])) {
        !           131:                                        break;
        !           132:                                }
        !           133:                        }
        !           134:                        break;
        !           135:                case ZEND_STACK_APPLY_BOTTOMUP:
        !           136:                        for (i=0; i<stack->top; i++) {
        !           137:                                if (apply_function(stack->elements[i])) {
        !           138:                                        break;
        !           139:                                }
        !           140:                        }
        !           141:                        break;
        !           142:        }
        !           143: }
        !           144: 
        !           145: 
        !           146: ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*apply_function)(void *element, void *arg), void *arg)
        !           147: {
        !           148:        int i;
        !           149: 
        !           150:        switch (type) {
        !           151:                case ZEND_STACK_APPLY_TOPDOWN:
        !           152:                        for (i=stack->top-1; i>=0; i--) {
        !           153:                                if (apply_function(stack->elements[i], arg)) {
        !           154:                                        break;
        !           155:                                }
        !           156:                        }
        !           157:                        break;
        !           158:                case ZEND_STACK_APPLY_BOTTOMUP:
        !           159:                        for (i=0; i<stack->top; i++) {
        !           160:                                if (apply_function(stack->elements[i], arg)) {
        !           161:                                        break;
        !           162:                                }
        !           163:                        }
        !           164:                        break;
        !           165:        }
        !           166: }
        !           167: 
        !           168: /*
        !           169:  * Local variables:
        !           170:  * tab-width: 4
        !           171:  * c-basic-offset: 4
        !           172:  * indent-tabs-mode: t
        !           173:  * End:
        !           174:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>