1 |
|
|
/* |
2 |
|
|
Copyright 2019, 2021, 2024 Joel Svensson svenssonjoel@yahoo.se |
3 |
|
|
|
4 |
|
|
This program is free software: you can redistribute it and/or modify |
5 |
|
|
it under the terms of the GNU General Public License as published by |
6 |
|
|
the Free Software Foundation, either version 3 of the License, or |
7 |
|
|
(at your option) any later version. |
8 |
|
|
|
9 |
|
|
This program is distributed in the hope that it will be useful, |
10 |
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 |
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 |
|
|
GNU General Public License for more details. |
13 |
|
|
|
14 |
|
|
You should have received a copy of the GNU General Public License |
15 |
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 |
|
|
*/ |
17 |
|
|
|
18 |
|
|
#include <lbm_memory.h> |
19 |
|
|
#include <lbm_types.h> |
20 |
|
|
#include <string.h> |
21 |
|
|
|
22 |
|
|
#include "stack.h" |
23 |
|
|
#include "print.h" |
24 |
|
|
|
25 |
|
|
#define STACK_UNUSED_BYTE 0x55 |
26 |
|
|
#ifndef LBM64 |
27 |
|
|
#define STACK_UNUSED_WORD 0x55555555 |
28 |
|
|
#else |
29 |
|
|
#define STACK_UNUSED_WORD 0x5555555555555555 |
30 |
|
|
#endif |
31 |
|
|
|
32 |
|
22764 |
int lbm_stack_allocate(lbm_stack_t *s, lbm_uint stack_size) { |
33 |
|
22764 |
int r = 0; |
34 |
|
22764 |
s->data = lbm_memory_allocate(stack_size); |
35 |
✓✓ |
22764 |
if (s->data) { |
36 |
|
22708 |
memset(s->data, STACK_UNUSED_BYTE, stack_size * sizeof(lbm_uint)); |
37 |
|
22708 |
s->sp = 0; |
38 |
|
22708 |
s->size = stack_size; |
39 |
|
22708 |
r = 1; |
40 |
|
|
} |
41 |
|
22764 |
return r; |
42 |
|
|
} |
43 |
|
|
|
44 |
|
43344 |
int lbm_stack_create(lbm_stack_t *s, lbm_uint* data, lbm_uint stack_size) { |
45 |
|
43344 |
s->data = data; |
46 |
|
43344 |
memset(s->data, STACK_UNUSED_BYTE, stack_size * sizeof(lbm_uint)); |
47 |
|
43344 |
s->sp = 0; |
48 |
|
43344 |
s->size = stack_size; |
49 |
|
43344 |
return 1; |
50 |
|
|
} |
51 |
|
|
|
52 |
|
|
lbm_uint lbm_get_max_stack(lbm_stack_t *s) { |
53 |
|
|
lbm_uint unused = 0; |
54 |
|
|
for (int i = (int)s->size-1 ; i >= 0; i --) { |
55 |
|
|
if (s->data[i] == STACK_UNUSED_WORD) { |
56 |
|
|
unused ++; |
57 |
|
|
} else { |
58 |
|
|
break; |
59 |
|
|
} |
60 |
|
|
} |
61 |
|
|
return s->size - unused; |
62 |
|
|
} |
63 |
|
|
|
64 |
|
22483 |
void lbm_stack_free(lbm_stack_t *s) { |
65 |
✓✗ |
22483 |
if (s->data) { |
66 |
|
22483 |
lbm_memory_free(s->data); |
67 |
|
|
} |
68 |
|
22483 |
} |
69 |
|
|
|
70 |
|
45679 |
void lbm_stack_clear(lbm_stack_t *s) { |
71 |
|
45679 |
s->sp = 0; |
72 |
|
45679 |
} |
73 |
|
|
|
74 |
|
215465255 |
int lbm_stack_drop(lbm_stack_t *s, lbm_uint n) { |
75 |
|
|
|
76 |
✗✓ |
215465255 |
if (n > s->sp) return 0; |
77 |
|
|
|
78 |
|
215465255 |
s->sp -= n; |
79 |
|
215465255 |
return 1; |
80 |
|
|
} |
81 |
|
|
|
82 |
|
18731550 |
int lbm_push(lbm_stack_t *s, lbm_uint val) { |
83 |
|
18731550 |
int res = 1; |
84 |
✗✓ |
18731550 |
if (s->sp == s->size) { |
85 |
|
|
return 0; |
86 |
|
|
} |
87 |
|
18731550 |
s->data[s->sp++] = val; |
88 |
|
18731550 |
return res; |
89 |
|
|
} |
90 |
|
|
|
91 |
|
452424231 |
int lbm_pop(lbm_stack_t *s, lbm_uint *val) { |
92 |
|
452424231 |
s->sp--; |
93 |
|
452424231 |
*val = s->data[s->sp]; |
94 |
|
452424231 |
return 1; |
95 |
|
|
} |
96 |
|
|
|
97 |
|
6503602 |
int lbm_pop_2(lbm_stack_t *s, lbm_uint *r0, lbm_uint *r1) { |
98 |
|
6503602 |
s->sp--; |
99 |
|
6503602 |
*r0 = s->data[s->sp--]; |
100 |
|
6503602 |
*r1 = s->data[s->sp]; |
101 |
|
6503602 |
return 1; |
102 |
|
|
} |
103 |
|
|
|
104 |
|
352526 |
int lbm_pop_3(lbm_stack_t *s, lbm_uint *r0, lbm_uint *r1, lbm_uint *r2) { |
105 |
|
352526 |
s->sp--; |
106 |
|
352526 |
*r0 = s->data[s->sp--]; |
107 |
|
352526 |
*r1 = s->data[s->sp--]; |
108 |
|
352526 |
*r2 = s->data[s->sp]; |
109 |
|
352526 |
return 1; |
110 |
|
|
} |
111 |
|
|
|