/*

buffer.h

Author: Tatu Ylonen <ylo@cs.hut.fi>

Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
                   All rights reserved

Created: Sat Mar 18 04:12:25 1995 ylo

Code for manipulating FIFO buffers.

*/

/* RCSID("$Id: buffer.h,v 1.1 1999/10/27 03:42:43 damien Exp $"); */

#ifndef BUFFER_H
#define BUFFER_H

typedef struct
{
  char *buf;			/* Buffer for data. */
  unsigned int alloc;		/* Number of bytes allocated for data. */
  unsigned int offset;		/* Offset of first byte containing data. */
  unsigned int end;		/* Offset of last byte containing data. */
} Buffer;

/* Initializes the buffer structure. */
void buffer_init(Buffer *buffer);

/* Frees any memory used for the buffer. */
void buffer_free(Buffer *buffer);

/* Clears any data from the buffer, making it empty.  This does not actually
   zero the memory. */
void buffer_clear(Buffer *buffer);

/* Appends data to the buffer, expanding it if necessary. */
void buffer_append(Buffer *buffer, const char *data, unsigned int len);

/* Appends space to the buffer, expanding the buffer if necessary.
   This does not actually copy the data into the buffer, but instead
   returns a pointer to the allocated region. */
void buffer_append_space(Buffer *buffer, char **datap, unsigned int len);

/* Returns the number of bytes of data in the buffer. */
unsigned int buffer_len(Buffer *buffer);

/* Gets data from the beginning of the buffer. */
void buffer_get(Buffer *buffer, char *buf, unsigned int len);

/* Consumes the given number of bytes from the beginning of the buffer. */
void buffer_consume(Buffer *buffer, unsigned int bytes);

/* Consumes the given number of bytes from the end of the buffer. */
void buffer_consume_end(Buffer *buffer, unsigned int bytes);

/* Returns a pointer to the first used byte in the buffer. */
char *buffer_ptr(Buffer *buffer);

/* Dumps the contents of the buffer to stderr in hex.  This intended for
   debugging purposes only. */
void buffer_dump(Buffer *buffer);

#endif /* BUFFER_H */
