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>