1 /* 2 * Copyright (c) 2001-2009 Ville Laurikari <vl@iki.fi> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /* 30 tre-stack.h: Stack definitions 31 */ 32 33 #ifndef _TRE_STACK_H 34 #define _TRE_STACK_H 35 36 #include "tre.h" 37 38 typedef struct tre_stack_rec tre_stack_t; 39 40 /* Creates a new stack object. `size' is initial size in bytes, `max_size' 41 is maximum size, and `increment' specifies how much more space will be 42 allocated with realloc() if all space gets used up. Returns the stack 43 object or NULL if out of memory. */ 44 tre_stack_t * 45 tre_stack_new(int size, int max_size, int increment); 46 47 /* Frees the stack object. */ 48 void 49 tre_stack_destroy(tre_stack_t *s); 50 51 /* Returns the current number of objects in the stack. */ 52 int 53 tre_stack_num_objects(tre_stack_t *s); 54 55 /* Each tre_stack_push_*(tre_stack_t *s, <type> value) function pushes 56 `value' on top of stack `s'. Returns REG_ESPACE if out of memory. 57 This tries to realloc() more space before failing if maximum size 58 has not yet been reached. Returns REG_OK if successful. */ 59 #define declare_pushf(typetag, type) \ 60 reg_errcode_t tre_stack_push_ ## typetag(tre_stack_t *s, type value) 61 62 declare_pushf(voidptr, void *); 63 declare_pushf(int, int); 64 65 /* Each tre_stack_pop_*(tre_stack_t *s) function pops the topmost 66 element off of stack `s' and returns it. The stack must not be 67 empty. */ 68 #define declare_popf(typetag, type) \ 69 type tre_stack_pop_ ## typetag(tre_stack_t *s) 70 71 declare_popf(voidptr, void *); 72 declare_popf(int, int); 73 74 /* Just to save some typing. */ 75 #define STACK_PUSH(s, typetag, value) \ 76 do \ 77 { \ 78 status = tre_stack_push_ ## typetag(s, value); \ 79 } \ 80 while (/*CONSTCOND*/0) 81 82 #define STACK_PUSHX(s, typetag, value) \ 83 { \ 84 status = tre_stack_push_ ## typetag(s, value); \ 85 if (status != REG_OK) \ 86 break; \ 87 } 88 89 #define STACK_PUSHR(s, typetag, value) \ 90 { \ 91 reg_errcode_t _status; \ 92 _status = tre_stack_push_ ## typetag(s, value); \ 93 if (_status != REG_OK) \ 94 return _status; \ 95 } 96 97 #endif /* _TRE_STACK_H */