/* Copyright (C) 2007-2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
*/

#pragma once

#include <stdint.h>

/* Basic circular buffer type and methods */

typedef struct {
    uint8_t*  buff;
    int       size;
    int       rpos;
    int       count;
} CBuffer;

static __inline__ void
cbuffer_reset( CBuffer*  cb, void*  buff, int  size )
{
    cb->buff  = buff;
    cb->size  = size;
    cb->rpos  = 0;
    cb->count = 0;
}

static __inline__ int
cbuffer_write_avail( CBuffer*  cb )
{
    return cb->size - cb->count;
}

extern int  cbuffer_write( CBuffer*  cb, const void*  from, int  len );
extern int  cbuffer_write_peek( CBuffer*  cb, uint8_t*  *pbase );
extern void cbuffer_write_step( CBuffer*  cb, int  len );

static __inline__ int
cbuffer_read_avail( CBuffer*  cb )
{
    return cb->count;
}

extern int  cbuffer_read( CBuffer*  cb, void*  to, int  len );
extern int  cbuffer_read_peek( CBuffer*  cb, uint8_t*  *pbase );
extern void cbuffer_read_step( CBuffer*  cb, int  len );

extern const char*  cbuffer_quote( CBuffer*  cb );
extern const char*  cbuffer_quote_data( CBuffer*  cb );
extern void         cbuffer_print( CBuffer*  cb );
