bglibs
bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gstack.h
1#ifndef BGLIBS__GENERIC_STACK__H__
2#define BGLIBS__GENERIC_STACK__H__
3
4#include "adt_common.h"
5
20struct gstack_node
21{
23 struct gstack_node* next;
25 char data[0];
26};
27
29struct gstack
30{
32 struct gstack_node* head;
34 unsigned count;
35};
36
37int gstack_push(struct gstack* d, unsigned datasize, const void* data,
38 adt_copy_fn* fn);
39void* gstack_top(const struct gstack* s);
40void gstack_pop(struct gstack* s, adt_free_fn* fn);
41
43#define GSTACK_DECL(PREFIX,TYPE) \
44extern int PREFIX##_push(struct gstack* s, TYPE const* data); \
45extern TYPE* PREFIX##_top(struct gstack* s); \
46extern void PREFIX##_pop(struct gstack* s);
47
49#define GSTACK_PUSH_DEFN(PREFIX,TYPE,COPY) \
50int PREFIX##_push(struct gstack* s, TYPE const* data) { \
51 return gstack_push(s, sizeof *data, data, (adt_copy_fn*)COPY); \
52}
53
55#define GSTACK_TOP_DEFN(PREFIX,TYPE) \
56TYPE* PREFIX##_top(struct gstack* s) { \
57 return (s->head == 0) ? 0 : (TYPE*)s->head->data; \
58}
59
61#define GSTACK_POP_DEFN(PREFIX,FREE) \
62void PREFIX##_pop(struct gstack* s) { \
63 gstack_pop(s, (adt_free_fn*)(FREE)); \
64}
65
69#define GSTACK_DEFN(PREFIX,TYPE,COPY,FREE) \
70GSTACK_PUSH_DEFN(PREFIX,TYPE,COPY) \
71GSTACK_TOP_DEFN(PREFIX,TYPE) \
72GSTACK_POP_DEFN(PREFIX,FREE)
73
76#endif
void gstack_pop(struct gstack *s, adt_free_fn *fn)
Definition: gstack_pop.c:9
int gstack_push(struct gstack *s, unsigned datasize, const void *data, adt_copy_fn *fn)
Definition: gstack_push.c:8
void * gstack_top(const struct gstack *s)
Definition: gstack_top.c:5
void adt_free_fn(void *)
Definition: adt_common.h:12
int adt_copy_fn(void *, const void *)
Definition: adt_common.h:16
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gstack.h:21
char data[0]
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gstack.h:25
struct gstack_node * next
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gstack.h:23
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gstack.h:30
struct gstack_node * head
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gstack.h:32
unsigned count
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gstack.h:34