xref: /freebsd/contrib/libcbor/src/cbor/internal/stack.c (revision d9a42747950146bf03cda7f6e25d219253f8a57a)
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 
10 struct _cbor_stack _cbor_stack_init() {
11   return (struct _cbor_stack){.top = NULL, .size = 0};
12 }
13 
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 
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