forked from jviki/dtree
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstack.h
More file actions
109 lines (85 loc) · 1.49 KB
/
stack.h
File metadata and controls
109 lines (85 loc) · 1.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
* stack.h
* Copyright (C) 2013 Jan Viktorin
*/
#ifndef STACK_H
#define STACK_H
#include <stdlib.h>
#include <string.h>
#include <assert.h>
struct stack {
void *data;
struct stack *next;
};
static inline
int stack_empty(struct stack **s)
{
assert(s != NULL);
return *s == NULL;
}
static inline
size_t stack_depth(struct stack **s)
{
const struct stack *curr = *s;
size_t depth = 0;
for(; curr != NULL; curr = curr->next)
depth += 1;
return depth;
}
static inline
int stack_push(struct stack **s, void *data)
{
struct stack *news = malloc(sizeof(struct stack));
if(news == NULL)
return 1;
news->data = data;
news->next = *s;
*s = news;
return 0;
}
static inline
int stack_push_dup(struct stack **s, const void *data, size_t dlen)
{
void *dup = malloc(dlen);
if(dup == NULL)
return -1;
memcpy(dup, data, dlen);
if(stack_push(s, dup)) {
free(dup);
return 1;
}
return 0;
}
static inline
void *stack_pop(struct stack **s)
{
if(stack_empty(s))
return NULL;
struct stack *curs = *s;
void *data = curs->data;
*s = curs->next;
memset(curs, 0, sizeof(struct stack));
free(curs);
return data;
}
static inline
void *stack_move(struct stack **src, struct stack **dst)
{
if(stack_empty(src))
return NULL;
struct stack *curs = *src;
void *data = curs->data;
*src = curs->next;
curs->next = *dst;
*dst = curs;
return data;
}
static inline
void *stack_top(struct stack **s)
{
if(stack_empty(s))
return NULL;
struct stack *curr = *s;
return curr->data;
}
#endif