Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/cddl/contrib/opensolaris/tools/ctf/cvt/stack.c
39586 views
1
/*
2
* CDDL HEADER START
3
*
4
* The contents of this file are subject to the terms of the
5
* Common Development and Distribution License, Version 1.0 only
6
* (the "License"). You may not use this file except in compliance
7
* with the License.
8
*
9
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10
* or http://www.opensolaris.org/os/licensing.
11
* See the License for the specific language governing permissions
12
* and limitations under the License.
13
*
14
* When distributing Covered Code, include this CDDL HEADER in each
15
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16
* If applicable, add the following below this CDDL HEADER, with the
17
* fields enclosed by brackets "[]" replaced with your own identifying
18
* information: Portions Copyright [yyyy] [name of copyright owner]
19
*
20
* CDDL HEADER END
21
*/
22
/*
23
* Copyright (c) 2001 by Sun Microsystems, Inc.
24
* All rights reserved.
25
*/
26
27
#pragma ident "%Z%%M% %I% %E% SMI"
28
29
/*
30
* Routines for manipulating stacks
31
*/
32
33
#include <stdio.h>
34
#include <assert.h>
35
#include <stdlib.h>
36
37
#include "stack.h"
38
#include "memory.h"
39
40
#define STACK_SEEDSIZE 5
41
42
struct stk {
43
int st_nument;
44
int st_top;
45
void **st_data;
46
47
void (*st_free)(void *);
48
};
49
50
stk_t *
51
stack_new(void (*freep)(void *))
52
{
53
stk_t *sp;
54
55
sp = xmalloc(sizeof (stk_t));
56
sp->st_nument = STACK_SEEDSIZE;
57
sp->st_top = -1;
58
sp->st_data = xmalloc(sizeof (void *) * sp->st_nument);
59
sp->st_free = freep;
60
61
return (sp);
62
}
63
64
void
65
stack_free(stk_t *sp)
66
{
67
int i;
68
69
if (sp->st_free) {
70
for (i = 0; i <= sp->st_top; i++)
71
sp->st_free(sp->st_data[i]);
72
}
73
free(sp->st_data);
74
free(sp);
75
}
76
77
void *
78
stack_pop(stk_t *sp)
79
{
80
assert(sp->st_top >= 0);
81
82
return (sp->st_data[sp->st_top--]);
83
}
84
85
void *
86
stack_peek(stk_t *sp)
87
{
88
if (sp->st_top == -1)
89
return (NULL);
90
91
return (sp->st_data[sp->st_top]);
92
}
93
94
void
95
stack_push(stk_t *sp, void *data)
96
{
97
sp->st_top++;
98
99
if (sp->st_top == sp->st_nument) {
100
sp->st_nument += STACK_SEEDSIZE;
101
sp->st_data = xrealloc(sp->st_data,
102
sizeof (void *) * sp->st_nument);
103
}
104
105
sp->st_data[sp->st_top] = data;
106
}
107
108
int
109
stack_level(stk_t *sp)
110
{
111
return (sp->st_top + 1);
112
}
113
114