GCC Code Coverage Report


Directory: ../src/
File: /home/joels/Current/lispbm/src/stack.c
Date: 2025-08-08 18:10:24
Exec Total Coverage
Lines: 54 54 100.0%
Functions: 10 10 100.0%
Branches: 12 12 100.0%

Line Branch Exec Source
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 46633 int lbm_stack_allocate(lbm_stack_t *s, lbm_uint stack_size) {
33 46633 int r = 0;
34 46633 s->data = lbm_memory_allocate(stack_size);
35
2/2
✓ Branch 0 taken 46520 times.
✓ Branch 1 taken 113 times.
46633 if (s->data) {
36 46520 memset(s->data, STACK_UNUSED_BYTE, stack_size * sizeof(lbm_uint));
37 46520 s->sp = 0;
38 46520 s->size = stack_size;
39 46520 r = 1;
40 }
41 46633 return r;
42 }
43
44 88751 int lbm_stack_create(lbm_stack_t *s, lbm_uint* data, lbm_uint stack_size) {
45 88751 s->data = data;
46 88751 memset(s->data, STACK_UNUSED_BYTE, stack_size * sizeof(lbm_uint));
47 88751 s->sp = 0;
48 88751 s->size = stack_size;
49 88751 return 1;
50 }
51
52 7 lbm_uint lbm_get_max_stack(lbm_stack_t *s) {
53 7 lbm_uint unused = 0;
54
2/2
✓ Branch 0 taken 1068 times.
✓ Branch 1 taken 5 times.
1073 for (int i = (int)s->size-1 ; i >= 0; i --) {
55
2/2
✓ Branch 0 taken 1066 times.
✓ Branch 1 taken 2 times.
1068 if (s->data[i] == STACK_UNUSED_WORD) {
56 1066 unused ++;
57 } else {
58 2 break;
59 }
60 }
61 7 return s->size - unused;
62 }
63
64 46008 void lbm_stack_free(lbm_stack_t *s) {
65
2/2
✓ Branch 0 taken 46007 times.
✓ Branch 1 taken 1 times.
46008 if (s->data) {
66 46007 lbm_memory_free(s->data);
67 }
68 46008 }
69
70 668120 void lbm_stack_clear(lbm_stack_t *s) {
71 668120 s->sp = 0;
72 668120 }
73
74 1071937745 int lbm_stack_drop(lbm_stack_t *s, lbm_uint n) {
75
76
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1071937744 times.
1071937745 if (n > s->sp) return 0;
77
78 1071937744 s->sp -= n;
79 1071937744 return 1;
80 }
81
82 60596102 int lbm_push(lbm_stack_t *s, lbm_uint val) {
83 60596102 int res = 1;
84
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 60596100 times.
60596102 if (s->sp == s->size) {
85 2 return 0;
86 }
87 60596100 s->data[s->sp++] = val;
88 60596100 return res;
89 }
90
91 78565641 int lbm_pop(lbm_stack_t *s, lbm_uint *val) {
92 78565641 s->sp--;
93 78565641 *val = s->data[s->sp];
94 78565641 return 1;
95 }
96
97 1078 int lbm_pop_2(lbm_stack_t *s, lbm_uint *r0, lbm_uint *r1) {
98 1078 s->sp--;
99 1078 *r0 = s->data[s->sp--];
100 1078 *r1 = s->data[s->sp];
101 1078 return 1;
102 }
103
104 1 int lbm_pop_3(lbm_stack_t *s, lbm_uint *r0, lbm_uint *r1, lbm_uint *r2) {
105 1 s->sp--;
106 1 *r0 = s->data[s->sp--];
107 1 *r1 = s->data[s->sp--];
108 1 *r2 = s->data[s->sp];
109 1 return 1;
110 }
111
112