prop_stack.c revision 1.1
1/* $NetBSD: prop_stack.c,v 1.1 2007/08/16 21:44:08 joerg Exp $ */ 2 3/*- 4 * Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32#include "prop_stack.h" 33#include "prop_object_impl.h" 34 35void 36_prop_stack_init(prop_stack_t stack) 37{ 38 stack->used_intern_elems = 0; 39 SLIST_INIT(&stack->extern_elems); 40} 41 42bool 43_prop_stack_push(prop_stack_t stack, prop_object_t obj, void *obj_data, void *iter) 44{ 45 struct _prop_stack_extern_elem *eelem; 46 struct _prop_stack_intern_elem *ielem; 47 48 if (stack->used_intern_elems == PROP_STACK_INTERN_ELEMS) { 49 eelem = _PROP_MALLOC(sizeof(*eelem), M_TEMP); 50 51 if (eelem == NULL) 52 return false; 53 54 eelem->object = obj; 55 eelem->object_data = obj_data; 56 eelem->iterator = iter; 57 58 SLIST_INSERT_HEAD(&stack->extern_elems, eelem, stack_link); 59 60 return true; 61 } 62 63 _PROP_ASSERT(stack->used_intern_elems < PROP_STACK_INTERN_ELEMS); 64 _PROP_ASSERT(SLIST_EMPTY(&stack->extern_elems)); 65 66 ielem = &stack->intern_elems[stack->used_intern_elems]; 67 ielem->object = obj; 68 ielem->object_data = obj_data; 69 ielem->iterator = iter; 70 71 ++stack->used_intern_elems; 72 73 return true; 74} 75 76bool 77_prop_stack_pop(prop_stack_t stack, prop_object_t *obj, void **obj_data, void **iter) 78{ 79 struct _prop_stack_extern_elem *eelem; 80 struct _prop_stack_intern_elem *ielem; 81 82 if (stack->used_intern_elems == 0) 83 return false; 84 85 if ((eelem = SLIST_FIRST(&stack->extern_elems)) != NULL) { 86 _PROP_ASSERT(stack->used_intern_elems == PROP_STACK_INTERN_ELEMS); 87 88 SLIST_REMOVE_HEAD(&stack->extern_elems, stack_link); 89 *obj = eelem->object; 90 *obj_data = eelem->object_data; 91 *iter = eelem->iterator; 92 _PROP_FREE(eelem, M_TEMP); 93 return true; 94 } 95 96 --stack->used_intern_elems; 97 ielem = &stack->intern_elems[stack->used_intern_elems]; 98 99 *obj = ielem->object; 100 *obj_data = ielem->object_data; 101 *iter = ielem->iterator; 102 103 return true; 104} 105