LibJuno 0.42.0
LibJuno is a lightweight C99 library designed specifically for embedded systems.
Loading...
Searching...
No Matches
buff_stack_api.h
Go to the documentation of this file.
1/*
2 MIT License
3
4 Copyright (c) 2025 Robin A. Onsay
5
6 Permission is hereby granted, free of charge, to any person obtaining
7 a copy of this software and associated documentation files
8 (the "Software"), to deal in the Software without restriction,
9 including without limitation the rights to use, copy, modify, merge,
10 publish, distribute, sublicense, and/or sell copies of the Software,
11 and to permit persons to whom the Software is furnished to do so,
12 subject to the following conditions:
13
14 The above copyright notice and this permission notice shall be
15 included in all copies or substantial portions of the Software.
16*/
17
27#ifndef JUNO_BUFF_STACK_API_H
28#define JUNO_BUFF_STACK_API_H
29#include "juno/macros.h"
30#include "juno/status.h"
31#include "juno/module.h"
32#include "juno/types.h"
33#ifdef __cplusplus
34extern "C"
35{
36#endif
37
39typedef struct JUNO_BUFF_STACK_ROOT_TAG JUNO_BUFF_STACK_ROOT_T;
42
43struct JUNO_BUFF_STACK_ROOT_TAG JUNO_MODULE_ROOT(void,
45 size_t zLength;
47 size_t zCapacity;
48);
49
51static inline JUNO_STATUS_T JunoBuff_StackInit(JUNO_BUFF_STACK_T *ptStack, size_t zCapacity, JUNO_FAILURE_HANDLER_T pfcnFailureHdlr, JUNO_USER_DATA_T *pvFailureUserData)
52{
53 JUNO_ASSERT_EXISTS(ptStack);
54 JUNO_BUFF_STACK_ROOT_T *ptStackRoot = (JUNO_BUFF_STACK_ROOT_T *)(ptStack);
55 ptStackRoot->zLength = 0;
56 ptStackRoot->zCapacity = zCapacity;
57 ptStackRoot->_pfcnFailureHandler = pfcnFailureHdlr;
58 ptStackRoot->_pvFailureUserData = pvFailureUserData;
60}
61
64static inline JUNO_RESULT_SIZE_T JunoBuff_StackPush(JUNO_BUFF_STACK_T *ptStack)
65{
66 JUNO_RESULT_SIZE_T tResult = {JUNO_STATUS_SUCCESS,0};
67 if(!ptStack)
68 {
69 tResult.tStatus = JUNO_STATUS_NULLPTR_ERROR;
70 return tResult;
71 }
72 JUNO_BUFF_STACK_ROOT_T *ptStackRoot = (JUNO_BUFF_STACK_ROOT_T *)(ptStack);
73 if(ptStackRoot->zLength < ptStackRoot->zCapacity)
74 {
75 tResult.tOk = ptStackRoot->zLength;
76 ptStackRoot->zLength += 1;
77 }
78 else
79 {
80 tResult.tStatus = JUNO_STATUS_INVALID_SIZE_ERROR;
81 JUNO_FAIL(tResult.tStatus, ptStackRoot->_pfcnFailureHandler, ptStackRoot->_pvFailureUserData, "Failed to enqueue data");
82 return tResult;
83 }
84 return tResult;
85}
86
89static inline JUNO_RESULT_SIZE_T JunoBuff_StackPop(JUNO_BUFF_STACK_T *ptStack)
90{
91 JUNO_RESULT_SIZE_T tResult = {JUNO_STATUS_SUCCESS,0};
92 if(!ptStack)
93 {
94 tResult.tStatus = JUNO_STATUS_NULLPTR_ERROR;
95 return tResult;
96 }
97 JUNO_BUFF_STACK_ROOT_T *ptStackRoot = (JUNO_BUFF_STACK_ROOT_T *)(ptStack);
98 if(ptStackRoot->zLength > 0)
99 {
100 ptStackRoot->zLength -= 1;
101 tResult.tOk = ptStackRoot->zLength;
102 return tResult;
103 }
104 tResult.tStatus = JUNO_STATUS_INVALID_SIZE_ERROR;
105 JUNO_FAIL(tResult.tStatus, ptStackRoot->_pfcnFailureHandler, ptStackRoot->_pvFailureUserData, "Failed to enqueue data");
106 return tResult;
107}
108
111static inline JUNO_RESULT_SIZE_T JunoBuff_StackPeek(JUNO_BUFF_STACK_T *ptStack)
112{
113 JUNO_RESULT_SIZE_T tResult = {JUNO_STATUS_SUCCESS,0};
114 if(!ptStack)
115 {
116 tResult.tStatus = JUNO_STATUS_NULLPTR_ERROR;
117 return tResult;
118 }
119 JUNO_BUFF_STACK_ROOT_T *ptStackRoot = (JUNO_BUFF_STACK_ROOT_T *)(ptStack);
120 tResult.tOk = ptStackRoot->zLength;
121 return tResult;
122}
123
124
125#ifdef __cplusplus
126}
127#endif
128#endif // JUNO_BUFF_STACK_API_H
static JUNO_RESULT_SIZE_T JunoBuff_StackPeek(JUNO_BUFF_STACK_T *ptStack)
Definition buff_stack_api.h:111
static JUNO_RESULT_SIZE_T JunoBuff_StackPush(JUNO_BUFF_STACK_T *ptStack)
Definition buff_stack_api.h:64
struct JUNO_BUFF_STACK_ROOT_TAG JUNO_BUFF_STACK_ROOT_T
The buffer stack root module.
Definition buff_stack_api.h:39
static JUNO_STATUS_T JunoBuff_StackInit(JUNO_BUFF_STACK_T *ptStack, size_t zCapacity, JUNO_FAILURE_HANDLER_T pfcnFailureHdlr, JUNO_USER_DATA_T *pvFailureUserData)
Initialize a buffer stack.
Definition buff_stack_api.h:51
union JUNO_BUFF_STACK_T JUNO_BUFF_STACK_T
The buffer stack.
Definition buff_stack_api.h:41
static JUNO_RESULT_SIZE_T JunoBuff_StackPop(JUNO_BUFF_STACK_T *ptStack)
Definition buff_stack_api.h:89
#define JUNO_ASSERT_EXISTS(ptr)
Definition macros.h:28
#define JUNO_MODULE_ROOT(API_T,...)
Definition module.h:182
void(* JUNO_FAILURE_HANDLER_T)(JUNO_STATUS_T tStatus, const char *pcCustomMessage, JUNO_USER_DATA_T *pvUserData)
Definition status.h:43
int32_t JUNO_STATUS_T
Definition status.h:23
#define JUNO_FAIL(tStatus, pfcnFailureHandler, pvFailureUserData, pcMessage)
Definition status.h:48
#define JUNO_STATUS_NULLPTR_ERROR
Definition status.h:26
#define JUNO_STATUS_INVALID_SIZE_ERROR
Definition status.h:30
#define JUNO_STATUS_SUCCESS
Definition status.h:24
void JUNO_USER_DATA_T
Definition status.h:42