summaryrefslogtreecommitdiff
path: root/ioreplay/src/datas/stack.c
blob: 94e83e30be8cb26baaad5707be5aa5546a4cba0d (plain)
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
// Copyright 2018 Mimecast Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "stack.h"


stack_s *stack_new()
{
    stack_s *s = Malloc(stack_s);
    *s = (stack_s) {
        .top = NULL, .size = 0
    };
    return s;
}

void stack_destroy(stack_s *s)
{
    stack_elem_s *current = s->top;

    while (current) {
        stack_elem_s *next = current->next;
        free(current);
        current = next;
    }

    free(s);
}

void stack_push(stack_s *s, void *data)
{
    stack_elem_s *new_top = Malloc(stack_elem_s);

    *new_top = (stack_elem_s) {
        .next = s->top,
         .data = data
    };

    s->top = new_top;
    s->size++;
}

void* stack_pop(stack_s *s)
{
    if (s->top == NULL) {
        return NULL;
    }

    stack_elem_s *old_top = s->top;

    void *data = old_top->data;
    s->top = old_top->next;
    free(old_top);
    s->size--;

    return data;
}

int stack_is_empty(stack_s *s)
{
    return s->top == NULL;
}

stack_s* stack_new_reverse_from(stack_s *s)
{
    stack_s* r = stack_new();

    while (!stack_is_empty(s)) {
        stack_push(r, stack_pop(s));
    }

    stack_destroy(s);

    return r;
}