agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
stack.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_TASK_MUTEX_H
8 #define ZRTOS_TASK_MUTEX_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/zrtos.h>
15 #include <zrtos/types.h>
16 #include <zrtos/mem.h>
17 
18 
19 typedef struct _zrtos_stack_t{
20  void *data;
21  size_t offset;
22  size_t length;
24 
26  zrtos_stack_t *thiz
27  ,void *data
28  ,size_t length
29 ){
30  thiz->data = data;
31  thiz->offset = 0;
32  thiz->length = length;
33  return true;
34 }
35 
36 static bool _zrtos_stack__cpy(
37  zrtos_stack_t *thiz
38  ,void *dest
39  ,void *src
40  ,size_t length
41  ,size_t offset_plus_length
42 ){
43  if(offset_plus_length <= thiz->length){
45  dest
46  ,src
47  ,length
48  );
49  return true;
50  }
51  return false;
52 }
53 
55  zrtos_stack_t *thiz
56  ,size_t offset
57  ,bool is_relative
58  ,bool is_negative
59  ,size_t *new_offset
60 ){
61  bool ret = true;
62  size_t thiz_offset = thiz->offset;
63  if(is_relative){
64  if(is_negative
65  && thiz_offset >= offset){
66  *new_offset = thiz_offset - offset;
67  }else if(thiz->length - thiz_offset >= offset){
68  *new_offset = thiz_offset + offset;
69  }else{
70  ret = false;
71  }
72  }else{
73  if(offset <= thiz->length){
74  *new_offset = offset;
75  }else{
76  ret = false;
77  }
78  }
79  return ret;
80 }
81 
83  zrtos_stack_t *thiz
84  ,size_t offset
85  ,bool is_relative
86  ,bool is_negative
87 ){
89  thiz
90  ,offset
91  ,is_relative
92  ,is_negative
93  ,&thiz->offset
94  );
95 }
96 
98  zrtos_stack_t *thiz
99  ,void *data
100  ,size_t length
101  ,size_t offset
102 ){
103  return _zrtos_stack__cpy(
104  thiz
105  ,data
107  thiz->data
108  ,offset
109  )
110  ,length
111  ,offset + length
112  );
113 }
114 
116  zrtos_stack_t *thiz
117  ,void *data
118  ,size_t length
119  ,size_t offset
120  ,bool is_relative
121  ,bool is_negative
122 ){
123  size_t new_offset;
125  thiz
126  ,offset
127  ,is_relative
128  ,is_negative
129  ,&new_offset
130  ) && zrtos_stack__read(
131  thiz
132  ,data
133  ,length
134  ,new_offset
135  );
136 }
137 
139  zrtos_stack_t *thiz
140  ,void *data
141  ,size_t length
142  ,size_t offset
143 ){
144  return _zrtos_stack__cpy(
145  thiz
147  thiz->data
148  ,offset
149  )
150  ,data
151  ,length
152  ,offset + length
153  );
154 }
155 
157  zrtos_stack_t *thiz
158  ,void *data
159  ,size_t length
160  ,size_t offset
161  ,bool is_relative
162  ,bool is_negative
163 ){
164  size_t new_offset;
166  thiz
167  ,offset
168  ,is_relative
169  ,is_negative
170  ,&new_offset
171  ) && zrtos_stack__write(
172  thiz
173  ,data
174  ,length
175  ,new_offset
176  );
177 }
178 
180  zrtos_stack_t *thiz
181  ,void *data
182  ,size_t length
183 ){
184  size_t offset = thiz->offset;
185  bool ret = _zrtos_stack__cpy(
186  thiz
188  thiz->data
189  ,offset
190  )
191  ,data
192  ,length
193  ,offset + length
194  );
195  if(ret){
196  thiz->offset += length;
197  }
198  return ret;
199 }
200 
202  zrtos_stack_t *thiz
203  ,void *data
204  ,size_t length
205 ){
206  size_t offset = thiz->offset;
207  if(offset >= length){
208  offset = (thiz->offset = offset - length);
210  data
212  thiz->data
213  ,offset
214  )
215  ,length
216  );
217  return true;
218  }
219  return false;
220 }
221 
223  zrtos_stack_t *thiz
224  ,void *data
225  ,size_t length
226 ){
227  size_t offset = thiz->offset;
228  if(offset + length <= thiz->length){
229  thiz->offset += length;
231  data
233  thiz->data
234  ,offset
235  )
236  ,length
237  );
238  return true;
239  }
240  return false;
241 }
242 
244  zrtos_stack_t *thiz
245  ,size_t offset
246 ){
247  if(offset <= thiz->length){
248  thiz->offset = offset;
249  return true;
250  }
251  return false;
252 }
253 
255  zrtos_stack_t *thiz
256 ){
257  return thiz->offset;
258 }
259 
260 
261 #ifdef __cplusplus
262 }
263 #endif
264 #endif
size_t length
Definition: stack.h:22
static bool _zrtos_stack__cpy(zrtos_stack_t *thiz, void *dest, void *src, size_t length, size_t offset_plus_length)
Definition: stack.h:36
bool zrtos_stack__read(zrtos_stack_t *thiz, void *data, size_t length, size_t offset)
Definition: stack.h:97
size_t zrtos_stack__get_offset(zrtos_stack_t *thiz)
Definition: stack.h:254
bool zrtos_stack__push(zrtos_stack_t *thiz, void *data, size_t length)
Definition: stack.h:179
bool zrtos_stack__write(zrtos_stack_t *thiz, void *data, size_t length, size_t offset)
Definition: stack.h:138
void * data
Definition: stack.h:20
bool zrtos_stack__init(zrtos_stack_t *thiz, void *data, size_t length)
Definition: stack.h:25
bool zrtos_stack__read_ex(zrtos_stack_t *thiz, void *data, size_t length, size_t offset, bool is_relative, bool is_negative)
Definition: stack.h:115
struct _zrtos_stack_t zrtos_stack_t
bool zrtos_stack__pop(zrtos_stack_t *thiz, void *data, size_t length)
Definition: stack.h:201
void zrtos_mem__cpy(void *dest, void *src, size_t length)
Definition: mem.h:105
void * zrtos_types__ptr_add(void *ptr, size_t byte_len)
Definition: types.h:35
bool zrtos_stack__set_offset(zrtos_stack_t *thiz, size_t offset)
Definition: stack.h:243
size_t offset
Definition: stack.h:21
bool zrtos_stack__shift(zrtos_stack_t *thiz, void *data, size_t length)
Definition: stack.h:222
static bool zrtos_stack__get_offset_ex(zrtos_stack_t *thiz, size_t offset, bool is_relative, bool is_negative, size_t *new_offset)
Definition: stack.h:54
bool zrtos_stack__set_offset_ex(zrtos_stack_t *thiz, size_t offset, bool is_relative, bool is_negative)
Definition: stack.h:82
bool zrtos_stack__write_ex(zrtos_stack_t *thiz, void *data, size_t length, size_t offset, bool is_relative, bool is_negative)
Definition: stack.h:156