source: trunk/lib/void_stack.c @ 32

Last change on this file since 32 was 31, checked in by tim, 19 years ago

Added new lightweight stack library

rewrote test program to use this instead of string concatenation/recursion.

  • Property svn:keywords set to Id
File size: 2.6 KB
RevLine 
[31]1/*
2 * This is a really simple implementation of a stack which stores chunks
3 * of memory of any type.  It still needs work to eliminate memory
4 * leaks.
5 *
6 * Copyright (C) 2005 Timothy D. Morgan
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; version 2 of the License.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
20 *
21 * $Id: void_stack.c 31 2005-07-16 19:05:19Z tim $
22 */
23
24#include "../include/void_stack.h"
25
26void_stack* void_stack_new(unsigned short max_size)
27{
28  void_stack* ret_val = (void_stack*)malloc(sizeof(void_stack));
29
30  if (ret_val != NULL)
31  {
32    memset(ret_val, 0, sizeof(*ret_val));
33    ret_val->elements = (void**)malloc(max_size*sizeof(void*));
34    if (ret_val->elements == NULL)
35    {
36      free(ret_val);
37      ret_val = NULL;
38    }
39    else
40    {
41      memset(ret_val->elements, 0, max_size*sizeof(void*));
42   
43      ret_val->max_size = max_size;
44      ret_val->top = 0;
45    }
46  }
47
48  return ret_val;
49}
50
51
52void void_stack_destroy(void_stack* stack)
53{
54  unsigned short i;
55  for(i=0; i < stack->top; i++)
56    free(stack->elements[i]);
57  free(stack);
58}
59
60
61bool void_stack_push(void_stack* stack, void* e)
62{
63  if(stack->top < stack->max_size)
64  {
65    stack->elements[stack->top++] = e;
66    return true;
67  }
68  else
69    return false;
70}
71
72
73void* void_stack_pop(void_stack* stack)
74{
75  void* ret_val = NULL;
76
77  if(stack->top > 0)
78  {
79    ret_val = stack->elements[--stack->top];
80    stack->elements[stack->top] = NULL;
81  }
82  else
83    ret_val = NULL;
84
85  return ret_val;
86}
87
88
89const void* void_stack_cur(void_stack* stack)
90{
91  void* ret_val = NULL;
92
93  if(stack->top > 0)
94    ret_val = stack->elements[stack->top-1];
95  else
96    ret_val = NULL;
97
98  return ret_val;
99}
100
101
102void_stack_iterator* void_stack_iterator_new(void_stack* stack)
103{
104  void_stack_iterator* ret_val = NULL;
105 
106  ret_val = (void_stack_iterator*)malloc(sizeof(void_stack_iterator));
107  if (ret_val != NULL)
108  {
109    ret_val->stack = stack;
110    ret_val->cur = 0;
111  }
112
113  return ret_val;
114}
115
116
117void void_stack_iterator_destroy(void_stack_iterator* iter)
118{
119  free(iter);
120}
121
122
123void* void_stack_iterator_next(void_stack_iterator* iter)
124{
125  if(iter->cur < iter->stack->top)
126    return iter->stack->elements[iter->cur++];
127  else
128    return NULL;
129}
Note: See TracBrowser for help on using the repository browser.