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
15typedef 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__private_extern__ tre_stack_t *
22tre_stack_new(int size, int max_size, int increment);
23
24/* Frees the stack object. */
25__private_extern__ void
26tre_stack_destroy(tre_stack_t *s);
27
28/* Returns the current number of objects in the stack. */
29__private_extern__ int
30tre_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  __private_extern__ reg_errcode_t tre_stack_push_ ## typetag(tre_stack_t *s, \
38							      type value)
39
40declare_pushf(voidptr, void *);
41declare_pushf(int, int);
42
43/* Each tre_stack_pop_*(tre_stack_t *s) function pops the topmost
44   element off of stack `s' and returns it.  The stack must not be
45   empty. */
46#define declare_popf(typetag, type)		  \
47  __private_extern__ type tre_stack_pop_ ## typetag(tre_stack_t *s)
48
49declare_popf(voidptr, void *);
50declare_popf(int, int);
51
52/* Just to save some typing. */
53#define STACK_PUSH(s, typetag, value)					      \
54  do									      \
55    {									      \
56      status = tre_stack_push_ ## typetag(s, value);			      \
57    }									      \
58  while (/*CONSTCOND*/0)
59
60#define STACK_PUSHX(s, typetag, value)					      \
61  {									      \
62    status = tre_stack_push_ ## typetag(s, value);			      \
63    if (status != REG_OK)						      \
64      break;								      \
65  }
66
67#define STACK_PUSHR(s, typetag, value)					      \
68  {									      \
69    reg_errcode_t _status;						      \
70    _status = tre_stack_push_ ## typetag(s, value);			      \
71    if (_status != REG_OK)						      \
72      return _status;							      \
73  }
74
75#endif /* TRE_STACK_H */
76
77/* EOF */
78