1/* $Id$Revision: */
2/* vim:set shiftwidth=4 ts=8: */
3
4/**********************************************************
5* See the LICENSE file for copyright information. *
6**********************************************************/
7
8#ifndef STACK_H
9#define STACK_H
10
11#ifdef __cplusplus
12extern "C" {
13#endif
14
15/* needed for intptr_t */
16#include "config.h"
17#include <stdint.h>
18
19#include "misc.h"
20
21/* CONVENTIONS: All data structures for stacks have the prefix */
22/* "stk_" to prevent name conflicts. */
23/* */
24/* Function names: Each word in a function name begins with */
25/* a capital letter. An example funcntion name is */
26/* CreateRedTree(a,b,c). Furthermore, each function name */
27/* should begin with a capital letter to easily distinguish */
28/* them from variables. */
29/* */
30/* Variable names: Each word in a variable name begins with */
31/* a capital letter EXCEPT the first letter of the variable */
32/* name. For example, int newLongInt. Global variables have */
33/* names beginning with "g". An example of a global */
34/* variable name is gNewtonsConstant. */
35
36/* if DATA_TYPE is undefined then stack.h and stack.c will be code for */
37/* stacks of void *, if they are defined then they will be stacks of the */
38/* appropriate data_type */
39
40#ifndef DATA_TYPE
41#define DATA_TYPE void *
42#endif
43
44typedef struct stk_stack_node {
45 DATA_TYPE info;
46 struct stk_stack_node * next;
47} stk_stack_node;
48
49typedef struct stk_stack {
50 stk_stack_node * top;
51 stk_stack_node * tail;
52} stk_stack ;
53
54/* These functions are all very straightforward and self-commenting so */
55/* I didn't think additional comments would be useful */
56stk_stack * StackJoin(stk_stack * stack1, stk_stack * stack2);
57stk_stack * StackCreate(void);
58void StackPush(stk_stack * theStack, DATA_TYPE newInfoPointer);
59void * StackPop(stk_stack * theStack);
60intptr_t StackNotEmpty(stk_stack *);
61
62#ifdef __cplusplus
63}
64#endif
65
66#endif
67