1/* 2 * = = == === ===== ======== ============= ===================== 3 * == pt::rde (critcl) - Data Structures - Generic stack 4 */ 5 6#ifndef _RDE_DS_STACK_H 7#define _RDE_DS_STACK_H 1 8 9#include <util.h> /* Scoping */ 10 11/* 12 * The stack data structure declared in this file is an array of void* 13 * cells, with each cell either directly containing the data, or being 14 * a pointer to it. 15 * 16 * The structure maintains a max-size field, reallocating the array if 17 * and only if we go over this size. Each allocation doubles the 18 * available room. 19 * 20 * A pointer to a delete function is maintained, to delete cells which 21 * are references to the actual data. 22 */ 23 24typedef void (*RDE_STACK_CELL_FREE) (void* cell); 25typedef struct RDE_STACK_* RDE_STACK; 26 27static const int RDE_STACK_INITIAL_SIZE = 256; 28 29/* 30 * Notes 31 * - push -- Item allocation is responsibility of caller. 32 * Stack takes ownership of the item. 33 * - pop -- Stack frees allocated item. 34 * - trim -- Ditto 35 * - top -- Provides top item, no transfer of ownership. 36 * - del -- Releases stack, cell array, and items, if any. 37 * - drop -- Like pop, but doesn't free, assumes that caller 38 * is taking ownership of the pointer. 39 */ 40 41/* SKIP START */ 42SCOPE RDE_STACK rde_stack_new (RDE_STACK_CELL_FREE freeCellProc); 43SCOPE void rde_stack_del (RDE_STACK s); 44 45SCOPE void* rde_stack_top (RDE_STACK s); 46SCOPE void rde_stack_push (RDE_STACK s, void* item); 47SCOPE void rde_stack_pop (RDE_STACK s, long int n); 48SCOPE void rde_stack_trim (RDE_STACK s, long int n); 49SCOPE void rde_stack_drop (RDE_STACK s, long int n); 50SCOPE void rde_stack_move (RDE_STACK dst, RDE_STACK src); 51SCOPE void rde_stack_get (RDE_STACK s, long int* cn, void*** cc); 52SCOPE long int rde_stack_size (RDE_STACK s); 53/* SKIP END */ 54#endif /* _RDE_DS_STACK_H */ 55 56/* 57 * Local Variables: 58 * mode: c 59 * c-basic-offset: 4 60 * fill-column: 78 61 * End: 62 */ 63