1*78acc472SPeter Tyser /* 2*78acc472SPeter Tyser * (C) Copyright 2003 3*78acc472SPeter Tyser * Gerry Hamel, geh@ti.com, Texas Instruments 4*78acc472SPeter Tyser * 5*78acc472SPeter Tyser * This program is free software; you can redistribute it and/or modify 6*78acc472SPeter Tyser * it under the terms of the GNU General Public License as published by 7*78acc472SPeter Tyser * the Free Software Foundation; either version 2 of the License, or 8*78acc472SPeter Tyser * (at your option) any later version. 9*78acc472SPeter Tyser * 10*78acc472SPeter Tyser * This program is distributed in the hope that it will be useful, 11*78acc472SPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*78acc472SPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*78acc472SPeter Tyser * GNU General Public License for more details. 14*78acc472SPeter Tyser * 15*78acc472SPeter Tyser * You should have received a copy of the GNU General Public License 16*78acc472SPeter Tyser * along with this program; if not, write to the Free Software 17*78acc472SPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18*78acc472SPeter Tyser * 19*78acc472SPeter Tyser */ 20*78acc472SPeter Tyser 21*78acc472SPeter Tyser #include <common.h> 22*78acc472SPeter Tyser #include <malloc.h> 23*78acc472SPeter Tyser 24*78acc472SPeter Tyser #include <circbuf.h> 25*78acc472SPeter Tyser 26*78acc472SPeter Tyser 27*78acc472SPeter Tyser int buf_init (circbuf_t * buf, unsigned int size) 28*78acc472SPeter Tyser { 29*78acc472SPeter Tyser assert (buf != NULL); 30*78acc472SPeter Tyser 31*78acc472SPeter Tyser buf->size = 0; 32*78acc472SPeter Tyser buf->totalsize = size; 33*78acc472SPeter Tyser buf->data = (char *) malloc (sizeof (char) * size); 34*78acc472SPeter Tyser assert (buf->data != NULL); 35*78acc472SPeter Tyser 36*78acc472SPeter Tyser buf->top = buf->data; 37*78acc472SPeter Tyser buf->tail = buf->data; 38*78acc472SPeter Tyser buf->end = &(buf->data[size]); 39*78acc472SPeter Tyser 40*78acc472SPeter Tyser return 1; 41*78acc472SPeter Tyser } 42*78acc472SPeter Tyser 43*78acc472SPeter Tyser int buf_free (circbuf_t * buf) 44*78acc472SPeter Tyser { 45*78acc472SPeter Tyser assert (buf != NULL); 46*78acc472SPeter Tyser assert (buf->data != NULL); 47*78acc472SPeter Tyser 48*78acc472SPeter Tyser free (buf->data); 49*78acc472SPeter Tyser memset (buf, 0, sizeof (circbuf_t)); 50*78acc472SPeter Tyser 51*78acc472SPeter Tyser return 1; 52*78acc472SPeter Tyser } 53*78acc472SPeter Tyser 54*78acc472SPeter Tyser int buf_pop (circbuf_t * buf, char *dest, unsigned int len) 55*78acc472SPeter Tyser { 56*78acc472SPeter Tyser unsigned int i; 57*78acc472SPeter Tyser char *p = buf->top; 58*78acc472SPeter Tyser 59*78acc472SPeter Tyser assert (buf != NULL); 60*78acc472SPeter Tyser assert (dest != NULL); 61*78acc472SPeter Tyser 62*78acc472SPeter Tyser /* Cap to number of bytes in buffer */ 63*78acc472SPeter Tyser if (len > buf->size) 64*78acc472SPeter Tyser len = buf->size; 65*78acc472SPeter Tyser 66*78acc472SPeter Tyser for (i = 0; i < len; i++) { 67*78acc472SPeter Tyser dest[i] = *p++; 68*78acc472SPeter Tyser /* Bounds check. */ 69*78acc472SPeter Tyser if (p == buf->end) { 70*78acc472SPeter Tyser p = buf->data; 71*78acc472SPeter Tyser } 72*78acc472SPeter Tyser } 73*78acc472SPeter Tyser 74*78acc472SPeter Tyser /* Update 'top' pointer */ 75*78acc472SPeter Tyser buf->top = p; 76*78acc472SPeter Tyser buf->size -= len; 77*78acc472SPeter Tyser 78*78acc472SPeter Tyser return len; 79*78acc472SPeter Tyser } 80*78acc472SPeter Tyser 81*78acc472SPeter Tyser int buf_push (circbuf_t * buf, const char *src, unsigned int len) 82*78acc472SPeter Tyser { 83*78acc472SPeter Tyser /* NOTE: this function allows push to overwrite old data. */ 84*78acc472SPeter Tyser unsigned int i; 85*78acc472SPeter Tyser char *p = buf->tail; 86*78acc472SPeter Tyser 87*78acc472SPeter Tyser assert (buf != NULL); 88*78acc472SPeter Tyser assert (src != NULL); 89*78acc472SPeter Tyser 90*78acc472SPeter Tyser for (i = 0; i < len; i++) { 91*78acc472SPeter Tyser *p++ = src[i]; 92*78acc472SPeter Tyser if (p == buf->end) { 93*78acc472SPeter Tyser p = buf->data; 94*78acc472SPeter Tyser } 95*78acc472SPeter Tyser /* Make sure pushing too much data just replaces old data */ 96*78acc472SPeter Tyser if (buf->size < buf->totalsize) { 97*78acc472SPeter Tyser buf->size++; 98*78acc472SPeter Tyser } else { 99*78acc472SPeter Tyser buf->top++; 100*78acc472SPeter Tyser if (buf->top == buf->end) { 101*78acc472SPeter Tyser buf->top = buf->data; 102*78acc472SPeter Tyser } 103*78acc472SPeter Tyser } 104*78acc472SPeter Tyser } 105*78acc472SPeter Tyser 106*78acc472SPeter Tyser /* Update 'tail' pointer */ 107*78acc472SPeter Tyser buf->tail = p; 108*78acc472SPeter Tyser 109*78acc472SPeter Tyser return len; 110*78acc472SPeter Tyser } 111