Annotation of embedaddon/php/Zend/zend_stack.c, revision 1.1.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>