xref: /freebsd/contrib/libcbor/src/cbor/internal/stack.c (revision 5d3e7166f6a0187fa3f8831b16a06bd9955c21ff)
1 /*
2  * Copyright (c) 2014-2020 Pavel Kalvoda <me@pavelkalvoda.com>
3  *
4  * libcbor is free software; you can redistribute it and/or modify
5  * it under the terms of the MIT license. See LICENSE for details.
6  */
7 
8 #include "stack.h"
9 
_cbor_stack_init(void)10 struct _cbor_stack _cbor_stack_init(void) {
11   return (struct _cbor_stack){.top = NULL, .size = 0};
12 }
13 
_cbor_stack_pop(struct _cbor_stack * stack)14 void _cbor_stack_pop(struct _cbor_stack *stack) {
15   struct _cbor_stack_record *top = stack->top;
16   stack->top = stack->top->lower;
17   _cbor_free(top);
18   stack->size--;
19 }
20 
_cbor_stack_push(struct _cbor_stack * stack,cbor_item_t * item,size_t subitems)21 struct _cbor_stack_record *_cbor_stack_push(struct _cbor_stack *stack,
22                                             cbor_item_t *item,
23                                             size_t subitems) {
24   if (stack->size == CBOR_MAX_STACK_SIZE) return NULL;
25   struct _cbor_stack_record *new_top =
26       _cbor_malloc(sizeof(struct _cbor_stack_record));
27   if (new_top == NULL) return NULL;
28 
29   *new_top = (struct _cbor_stack_record){stack->top, item, subitems};
30   stack->top = new_top;
31   stack->size++;
32   return new_top;
33 }
34