209b8c2c01c76b858fd63599da4e3c43dd0e74b8
[people/lynusvaz/gpxe.git] / src / hci / gen_stack.c
1 #include <errno.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdio.h>
5
6 #include <gpxe/gen_stack.h>
7
8
9
10 void init_generic_stack ( struct generic_stack *stack, size_t size ) {
11         stack->ptr = NULL;
12         stack->tos = -1;
13         stack->size = size;
14 }
15
16
17 int pop_generic_stack ( struct generic_stack *stack, void *ptr ) {
18         if ( stack->tos >= 0 ) {
19                 void *nptr;
20                 memcpy ( ptr, ( void * ) ( ( (int)stack->ptr ) + stack->size * stack->tos-- ), stack->size );
21                 nptr = realloc ( stack->ptr, stack->size * ( stack->tos + 1 ) );
22                 if ( nptr ) {
23                         stack->ptr = nptr;
24                         if ( stack->tos == -1 )
25                                 stack->ptr = NULL;
26                         return 0;
27                 } else
28                         return -ENOMEM;
29         } else
30                 return -ENOMEM;
31 }
32
33 void free_generic_stack ( struct generic_stack *stack, int on_stack ) {
34         void *ptr = NULL;
35         if ( on_stack ) {
36                 while ( !pop_generic_stack ( stack, ptr ) ) {
37                         free ( ptr );
38                 }
39         }
40         free ( stack->ptr );
41 }
42
43 int push_generic_stack ( struct generic_stack *stack, void *str, int is_string ) {
44         char **nptr;
45         nptr = realloc ( stack->ptr, stack->size * ( stack->tos + 2 ) );
46         if ( !nptr ) {
47                 printf ( "error in resizing stack\n" );
48                 return -ENOMEM;
49         }
50         stack->ptr = nptr;
51         stack->tos++;
52         if ( !is_string ) 
53                 memcpy ( ( void * ) ( ( ( int ) stack->ptr ) + stack->size * stack->tos ), str, stack->size );
54         else {
55                 if ( asprintf ( ( char ** ) ( ( ( int ) stack->ptr ) + stack->size * stack->tos ), "%s", *( char ** ) str ) < 0 ) {
56                         return -ENOMEM;
57                 }
58         }
59         return 0;
60 }