169c410b8SPete Spreadborough /* SPDX-License-Identifier: BSD-3-Clause 2*e6e8f03eSRandy Schacher * Copyright(c) 2019-2023 Broadcom 369c410b8SPete Spreadborough * All rights reserved. 469c410b8SPete Spreadborough */ 569c410b8SPete Spreadborough #ifndef _STACK_H_ 669c410b8SPete Spreadborough #define _STACK_H_ 769c410b8SPete Spreadborough 869c410b8SPete Spreadborough #include <stdio.h> 969c410b8SPete Spreadborough #include <stdlib.h> 1069c410b8SPete Spreadborough #include <stdbool.h> 1169c410b8SPete Spreadborough #include <stdint.h> 1269c410b8SPete Spreadborough 1369c410b8SPete Spreadborough /** Stack data structure 1469c410b8SPete Spreadborough */ 1569c410b8SPete Spreadborough struct stack { 1669c410b8SPete Spreadborough int max; /**< Maximum number of entries */ 1769c410b8SPete Spreadborough int top; /**< maximum value in stack */ 1869c410b8SPete Spreadborough uint32_t *items; /**< items in the stack */ 1969c410b8SPete Spreadborough }; 2069c410b8SPete Spreadborough 2169c410b8SPete Spreadborough /** Initialize stack of uint32_t elements 2269c410b8SPete Spreadborough * 2369c410b8SPete Spreadborough * [in] num_entries 2469c410b8SPete Spreadborough * maximum number of elements in the stack 2569c410b8SPete Spreadborough * 2669c410b8SPete Spreadborough * [in] items 2769c410b8SPete Spreadborough * pointer to items (must be sized to (uint32_t * num_entries) 2869c410b8SPete Spreadborough * 2969c410b8SPete Spreadborough * s[in] st 3069c410b8SPete Spreadborough * pointer to the stack structure 3169c410b8SPete Spreadborough * 3269c410b8SPete Spreadborough * return 3369c410b8SPete Spreadborough * 0 for success 3469c410b8SPete Spreadborough */ 3569c410b8SPete Spreadborough int stack_init(int num_entries, 3669c410b8SPete Spreadborough uint32_t *items, 3769c410b8SPete Spreadborough struct stack *st); 3869c410b8SPete Spreadborough 39ae2ebb98SPeter Spreadborough /** Return the address of the stack contents 40ae2ebb98SPeter Spreadborough * 41ae2ebb98SPeter Spreadborough * [in] st 42ae2ebb98SPeter Spreadborough * pointer to the stack 43ae2ebb98SPeter Spreadborough * 44ae2ebb98SPeter Spreadborough * return 45ae2ebb98SPeter Spreadborough * pointer to the stack contents 46ae2ebb98SPeter Spreadborough */ 47ae2ebb98SPeter Spreadborough uint32_t *stack_items(struct stack *st); 48ae2ebb98SPeter Spreadborough 4969c410b8SPete Spreadborough /** Return the size of the stack 5069c410b8SPete Spreadborough * 5169c410b8SPete Spreadborough * [in] st 5269c410b8SPete Spreadborough * pointer to the stack 5369c410b8SPete Spreadborough * 5469c410b8SPete Spreadborough * return 5569c410b8SPete Spreadborough * number of elements 5669c410b8SPete Spreadborough */ 5769c410b8SPete Spreadborough int32_t stack_size(struct stack *st); 5869c410b8SPete Spreadborough 5969c410b8SPete Spreadborough /** Check if the stack is empty 6069c410b8SPete Spreadborough * 6169c410b8SPete Spreadborough * [in] st 6269c410b8SPete Spreadborough * pointer to the stack 6369c410b8SPete Spreadborough * 6469c410b8SPete Spreadborough * return 6569c410b8SPete Spreadborough * true or false 6669c410b8SPete Spreadborough */ 6769c410b8SPete Spreadborough bool stack_is_empty(struct stack *st); 6869c410b8SPete Spreadborough 6969c410b8SPete Spreadborough /** Check if the stack is full 7069c410b8SPete Spreadborough * 7169c410b8SPete Spreadborough * [in] st 7269c410b8SPete Spreadborough * pointer to the stack 7369c410b8SPete Spreadborough * 7469c410b8SPete Spreadborough * return 7569c410b8SPete Spreadborough * true or false 7669c410b8SPete Spreadborough */ 7769c410b8SPete Spreadborough bool stack_is_full(struct stack *st); 7869c410b8SPete Spreadborough 7969c410b8SPete Spreadborough /** Add element x to the stack 8069c410b8SPete Spreadborough * 8169c410b8SPete Spreadborough * [in] st 8269c410b8SPete Spreadborough * pointer to the stack 8369c410b8SPete Spreadborough * 8469c410b8SPete Spreadborough * [in] x 8569c410b8SPete Spreadborough * value to push on the stack 8669c410b8SPete Spreadborough * return 8769c410b8SPete Spreadborough * 0 for success 8869c410b8SPete Spreadborough */ 8969c410b8SPete Spreadborough int stack_push(struct stack *st, uint32_t x); 9069c410b8SPete Spreadborough 9169c410b8SPete Spreadborough /** Pop top element x from the stack and return 9269c410b8SPete Spreadborough * in user provided location. 9369c410b8SPete Spreadborough * 9469c410b8SPete Spreadborough * [in] st 9569c410b8SPete Spreadborough * pointer to the stack 9669c410b8SPete Spreadborough * 9769c410b8SPete Spreadborough * [in, out] x 9869c410b8SPete Spreadborough * pointer to where the value popped will be written 9969c410b8SPete Spreadborough * 10069c410b8SPete Spreadborough * return 10169c410b8SPete Spreadborough * 0 for success 10269c410b8SPete Spreadborough */ 10369c410b8SPete Spreadborough int stack_pop(struct stack *st, uint32_t *x); 10469c410b8SPete Spreadborough 10569c410b8SPete Spreadborough /** Dump stack information 10669c410b8SPete Spreadborough * 10769c410b8SPete Spreadborough * Warning: Don't use for large stacks due to prints 10869c410b8SPete Spreadborough * 10969c410b8SPete Spreadborough * [in] st 11069c410b8SPete Spreadborough * pointer to the stack 11169c410b8SPete Spreadborough * 11269c410b8SPete Spreadborough * return 11369c410b8SPete Spreadborough * none 11469c410b8SPete Spreadborough */ 11569c410b8SPete Spreadborough void stack_dump(struct stack *st); 11669c410b8SPete Spreadborough #endif /* _STACK_H_ */ 117