blob: 7b4e705a572ef93b5700a587bcdaf90ff8e60538 [file] [log] [blame]
/*****************************************************************************
* cbuf.h
*****************************************************************************
* Copyright (C) 2002-2005 The Regents of the University of California.
* Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
* Written by Chris Dunlap <cdunlap@llnl.gov>.
*
* This file is from LSD-Tools, the LLNL Software Development Toolbox.
*
* LSD-Tools is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* In addition, as a special exception, the copyright holders give permission
* to link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file, and
* distribute linked combinations including the two. You must obey the GNU
* General Public License in all respects for all of the code used other than
* OpenSSL. If you modify file(s) with this exception, you may extend this
* exception to your version of the file(s), but you are not obligated to do
* so. If you do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source files in
* the program, then also delete it here.
*
* LSD-Tools 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.
*
* You should have received a copy of the GNU General Public License along
* with LSD-Tools; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*****************************************************************************/
#ifndef LSD_CBUF_H
#define LSD_CBUF_H
#include <stdbool.h>
/*
* Cbuf is a circular-buffer capable of dynamically resizing itself.
* Unread data in the buffer will be overwritten once the cbuf has
* reached its maximum size or is unable to allocate additional memory.
*
* The CBUF_OPT_OVERWRITE option specifies how unread cbuf data will
* be overwritten. If set to CBUF_NO_DROP, unread data will never be
* overwritten; writes into the cbuf will return -1 with ENOSPC. If set
* to CBUF_WRAP_ONCE, a single write operation will wrap-around the buffer
* at most once, and up to cbuf_used() bytes of data may be overwritten.
* If set to CBUF_WRAP_MANY, a single write operation will wrap-around the
* buffer as many times as needed in order to write all of the data.
*
* These routines are thread-safe.
*/
/****************
* Data Types *
****************/
typedef struct cbuf cbuf_t; /* circular-buffer opaque data type */
/***************
* Functions *
***************/
/*
* Creates and returns a new circular buffer.
* The default overwrite option behavior is CBUF_WRAP_MANY.
* Abandoning a cbuf without calling cbuf_destroy() will cause a memory leak.
*/
extern cbuf_t *cbuf_create(int size, bool overwrite);
/*
* Destroys the circular buffer [cb].
*/
extern void cbuf_destroy(cbuf_t *cb);
/*
* Returns the number of bytes in [cb] available for writing before unread
* data is overwritten (assuming the cbuf can resize itself if needed).
*/
extern int cbuf_free(cbuf_t *cb);
/*
* Returns the number of bytes in [cb] available for reading.
*/
extern int cbuf_used(cbuf_t *cb);
/*
* Reads up to [len] bytes of data from the [src] cbuf into [dstbuf].
* Returns the number of bytes read, or -1 on error (with errno set).
*/
extern int cbuf_read(cbuf_t *src, void *dstbuf, int len);
/*
* Writes up to [len] bytes of data from [srcbuf] into the [dst] cbuf
* according to dst's CBUF_OPT_OVERWRITE behavior.
* Returns the number of bytes written, or -1 on error (with errno set).
* Sets [ndropped] (if not NULL) to the number of bytes overwritten.
*/
extern int cbuf_write(cbuf_t *dst, void *srcbuf, int len, int *ndropped);
/*
* Reads the specified [lines] of data from the [src] cbuf into [dstbuf],
* but does not consume the data read from the cbuf. If [lines] is -1,
* reads the maximum number of lines that [dstbuf] can hold. The buffer
* will be NUL-terminated and contain at most ([len] - 1) characters.
* The "peek" can be committed to the cbuf via a call to cbuf_drop(),
* but the peek+drop combination is not atomic.
* Returns strlen of the line(s) on success; truncation occurred if >= [len].
* Returns 0 if the number of lines is not available (ie, all or none).
* Returns -1 on error (with errno set).
*/
extern int cbuf_peek_line(cbuf_t *src, char *dstbuf, int len, int lines);
/*
* Reads the specified [lines] of data from the [src] cbuf into [dstbuf].
* If [lines] is -1, reads the maximum number of lines that [dstbuf]
* can hold. The buffer will be NUL-terminated and contain at most
* ([len] - 1) characters.
* Returns strlen of the line(s) on success; truncation occurred if >= [len],
* in which case excess line data is discarded. Returns 0 if the number
* of lines is not available (ie, all or none), in which case no data is
* consumed. Returns -1 on error (with errno set).
*/
extern int cbuf_read_line(cbuf_t *src, char *dstbuf, int len, int lines);
/*
* Reads up to [len] bytes of data from the [src] cbuf into the file
* referenced by the [dstfd] file descriptor. If [len] is -1, it will
* be set to the number of [src] bytes available for reading.
* Returns the number of bytes read, or -1 on error (with errno set).
*/
extern int cbuf_read_to_fd(cbuf_t *src, int dstfd, int len);
/*
* Writes up to [len] bytes of data from the file referenced by the
* [srcfd] file descriptor into the [dst] cbuf according to dst's
* CBUF_OPT_OVERWRITE behavior. If [len] is -1, it will be set to
* an appropriate chunk size.
* Returns the number of bytes written, 0 on EOF, or -1 on error (with errno).
* Sets [ndropped] (if not NULL) to the number of bytes overwritten.
*/
extern int cbuf_write_from_fd(cbuf_t *dst, int srcfd, int len, int *ndropped);
#endif