1 /* circularbytebuffer.c */
3 This file is part of the ARM-circularbytebuffer.
4 Copyright (C) 2009 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * \file circularbytebuffer.c
21 * \email daniel.otte@rub.de
24 * \license GPLv3 or later
25 * \ingroup circularbytebuffer
26 * \brief implementation for circular byte buffer
31 #include "circularbytebuffer.h"
34 #ifndef CIRCULARBYTEBUFFER_NO_MALLOC
35 # define CIRCULARBYTEBUFFER_NO_MALLOC 0
38 #ifndef CIRCULARBYTEBUFFER_NO_INIT2
39 # define CIRCULARBYTEBUFFER_NO_INIT2 0
42 #if CIRCULARBYTEBUFFER_NO_MALLOC==0
43 uint8_t circularbytebuffer_init(uint32_t buffersize, circularbytebuffer_t* cb){
44 cb->buffer_size = buffersize;
45 cb->buffer = malloc(buffersize);
46 cb->head = cb->tail = cb->buffer;
47 cb->top = cb->buffer + cb->buffer_size;
50 return 1; /* success */
51 return 0; /* malloc failed */
55 #if CIRCULARBYTEBUFFER_NO_INIT2==0
56 void circularbytebuffer_init2(uint32_t buffersize, circularbytebuffer_t* cb, void* buffer){
57 cb->buffer_size = buffersize;
59 cb->head = cb->tail = cb->buffer;
60 cb->top = cb->buffer + cb->buffer_size;
65 uint16_t circularbytebuffer_get_lifo(circularbytebuffer_t* cb){
71 cb->tail = (uint8_t*)(cb->tail) + 1;
73 cb->tail = (uint8_t*)(cb->tail) - cb->buffer_size;
77 uint16_t circularbytebuffer_get_fifo(circularbytebuffer_t* cb){
83 cb->head = (uint8_t*)(cb->head) - 1;
84 if(cb->head<cb->buffer)
85 cb->head = (uint8_t*)(cb->head) + cb->buffer_size;
89 uint8_t circularbytebuffer_append(uint8_t elem, circularbytebuffer_t* cb){
90 if(cb->fillcount==cb->buffer_size)
93 cb->tail = cb->tail - 1;
94 if(cb->tail<cb->buffer)
95 cb->tail = (uint8_t*)(cb->tail) + cb->buffer_size;
102 uint8_t circularbytebuffer_push(uint8_t elem, circularbytebuffer_t* cb){
103 if(cb->fillcount==cb->buffer_size)
106 cb->head = cb->head + 1;
107 if(cb->head>=cb->top)
108 cb->head = (uint8_t*)(cb->head) - cb->buffer_size;
115 uint32_t circularbytebuffer_cnt(circularbytebuffer_t* cb){
116 return (cb->fillcount);
119 #if CIRCULARBYTEBUFFER_NO_MALLOC==0
120 void circularbytebuffer_free(circularbytebuffer_t* cb){