blob: daa4411718a9d36b99654d9bc7a11d2acd8d9da7 (
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/*
* Copyright (c) 2026, Chloe M.
* Provided under the BSD-3 clause
*/
#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "cescal/symbol.h"
/*
* Push a symbol into a symbol table
*
* @symtab: Symbol table to push to
* @symbol: Symbol to push
*
* Returns zero on success
*/
static int
symbol_table_push(struct symbol_table *symtab, struct symbol *symbol)
{
if (symtab == NULL || symbol == NULL) {
errno = EINVAL;
return -1;
}
symbol->next = NULL;
if (symtab->head == NULL || symtab->tail == NULL) {
symtab->head = symbol;
symtab->tail = symbol;
} else {
symtab->head->next = symbol;
symtab->head = symbol;
}
return 0;
}
int
symbol_table_init(struct symbol_table *symtab)
{
if (symtab == NULL) {
errno = EINVAL;
return -1;
}
symtab->head = NULL;
symtab->tail = NULL;
return 0;
}
int
symbol_allocate(struct symbol_table *symtab, const char *name,
symtype_t type, struct symbol **res)
{
struct symbol *symbol;
if (symtab == NULL || name == NULL) {
errno = EINVAL;
return -1;
}
if (res == NULL) {
errno = EINVAL;
return -1;
}
symbol = malloc(sizeof(*symbol));
if (symbol == NULL) {
errno = -ENOMEM;
return -1;
}
symbol->name = strdup(name);
symbol->type = type;
if (symbol_table_push(symtab, symbol) < 0) {
free(symbol);
return -1;
}
*res = symbol;
return 0;
}
void
symbol_table_destroy(struct symbol_table *symtab)
{
struct symbol *symbol, *tmp;
if (symtab == NULL) {
return;
}
symbol = symtab->tail;
while (symbol != NULL) {
tmp = symbol;
if (tmp->name != NULL)
free(tmp->name);
free(tmp);
symbol = symbol->next;
}
}
struct symbol *
symbol_byname(struct symbol_table *symtab, const char *name)
{
struct symbol *symbol;
if (symtab == NULL || name == NULL) {
return NULL;
}
symbol = symtab->head;
while (symbol != NULL) {
if (*symbol->name != *name) {
symbol = symbol->next;
continue;
}
if (strcmp(symbol->name, name) == 0) {
return symbol;
}
symbol = symbol->next;
}
return NULL;
}
|