Rev 65106 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/*tre-stack.h: Stack definitionsThis software is released under a BSD-style license.See the file LICENSE for details and copyright.*/#ifndef TRE_STACK_H#define TRE_STACK_H 1#include "tre.h"typedef struct tre_stack_rec tre_stack_t;/* Creates a new stack object. `size' is initial size in bytes, `max_size'is maximum size, and `increment' specifies how much more space will beallocated with realloc() if all space gets used up. Returns the stackobject or NULL if out of memory. */tre_stack_t *tre_stack_new(int size, int max_size, int increment);/* Frees the stack object. */voidtre_stack_destroy(tre_stack_t *s);/* Returns the current number of objects in the stack. */inttre_stack_num_objects(tre_stack_t *s);/* Each tre_stack_push_*(tre_stack_t *s, <type> value) function pushes`value' on top of stack `s'. Returns REG_ESPACE if out of memory.This tries to realloc() more space before failing if maximum sizehas not yet been reached. Returns REG_OK if successful. */#define declare_pushf(typetag, type) \reg_errcode_t tre_stack_push_ ## typetag(tre_stack_t *s, type value)declare_pushf(voidptr, void *);declare_pushf(int, int);/* Each tre_stack_pop_*(tre_stack_t *s) function pops the topmostelement off of stack `s' and returns it. The stack must not beempty. */#define declare_popf(typetag, type) \type tre_stack_pop_ ## typetag(tre_stack_t *s)declare_popf(voidptr, void *);declare_popf(int, int);/* Just to save some typing. */#define STACK_PUSH(s, typetag, value) \do \{ \status = tre_stack_push_ ## typetag(s, value); \} \while (/*CONSTCOND*/(void)0,0)#define STACK_PUSHX(s, typetag, value) \{ \status = tre_stack_push_ ## typetag(s, value); \if (status != REG_OK) \break; \}#define STACK_PUSHR(s, typetag, value) \{ \reg_errcode_t _status; \_status = tre_stack_push_ ## typetag(s, value); \if (_status != REG_OK) \return _status; \}#endif /* TRE_STACK_H *//* EOF */