1 /* 2 tre-stack.h: Stack definitions 3 4 This software is released under a BSD-style license. 5 See the file LICENSE for details and copyright. 6 7 */ 8 9 10 #ifndef TRE_STACK_H 11 #define TRE_STACK_H 1 12 13 #include "tre.h" 14 15 typedef struct tre_stack_rec tre_stack_t; 16 17 /* Creates a new stack object. `size' is initial size in bytes, `max_size' 18 is maximum size, and `increment' specifies how much more space will be 19 allocated with realloc() if all space gets used up. Returns the stack 20 object or NULL if out of memory. */ 21 tre_stack_t * 22 tre_stack_new(int size, int max_size, int increment); 23 24 /* Frees the stack object. */ 25 void 26 tre_stack_destroy(tre_stack_t *s); 27 28 /* Returns the current number of objects in the stack. */ 29 int 30 tre_stack_num_objects(tre_stack_t *s); 31 32 /* Each tre_stack_push_*(tre_stack_t *s, <type> value) function pushes 33 `value' on top of stack `s'. Returns REG_ESPACE if out of memory. 34 This tries to realloc() more space before failing if maximum size 35 has not yet been reached. Returns REG_OK if successful. */ 36 #define declare_pushf(typetag, type) \ 37 reg_errcode_t tre_stack_push_ ## typetag(tre_stack_t *s, type value) 38 39 declare_pushf(voidptr, void *); 40 declare_pushf(long, long); 41 42 /* Each tre_stack_pop_*(tre_stack_t *s) function pops the topmost 43 element off of stack `s' and returns it. The stack must not be 44 empty. */ 45 #define declare_popf(typetag, type) \ 46 type tre_stack_pop_ ## typetag(tre_stack_t *s) 47 48 declare_popf(voidptr, void *); 49 declare_popf(long, long); 50 51 #define tre_stack_pop_int(stack) (int)tre_stack_pop_long(stack) 52 53 /* Just to save some typing. */ 54 #define STACK_PUSH(s, typetag, value) \ 55 do \ 56 { \ 57 status = tre_stack_push_ ## typetag(s, value); \ 58 } \ 59 while (/*CONSTCOND*/(void)0,0) 60 61 #define STACK_PUSHX(s, typetag, value) \ 62 { \ 63 status = tre_stack_push_ ## typetag(s, value); \ 64 if (status != REG_OK) \ 65 break; \ 66 } 67 68 #define STACK_PUSHR(s, typetag, value) \ 69 { \ 70 reg_errcode_t _status; \ 71 _status = tre_stack_push_ ## typetag(s, value); \ 72 if (_status != REG_OK) \ 73 return _status; \ 74 } 75 76 #endif /* TRE_STACK_H */ 77 78 /* EOF */ 79