/*

bufaux.h

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

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

Created: Wed Mar 29 02:18:23 1995 ylo

*/

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

#ifndef BUFAUX_H
#define BUFAUX_H

#include "buffer.h"

/* Stores an BIGNUM in the buffer with a 2-byte msb first bit count, followed
   by (bits+7)/8 bytes of binary data, msb first. */
void buffer_put_bignum(Buffer *buffer, BIGNUM *value);

/* Retrieves an BIGNUM from the buffer. */
int buffer_get_bignum(Buffer *buffer, BIGNUM *value);

/* Returns an integer from the buffer (4 bytes, msb first). */
unsigned int buffer_get_int(Buffer *buffer);

/* Stores an integer in the buffer in 4 bytes, msb first. */
void buffer_put_int(Buffer *buffer, unsigned int value);

/* Returns a character from the buffer (0 - 255). */
int buffer_get_char(Buffer *buffer);

/* Stores a character in the buffer. */
void buffer_put_char(Buffer *buffer, int value);

/* Returns an arbitrary binary string from the buffer.  The string cannot
   be longer than 256k.  The returned value points to memory allocated
   with xmalloc; it is the responsibility of the calling function to free
   the data.  If length_ptr is non-NULL, the length of the returned data
   will be stored there.  A null character will be automatically appended
   to the returned string, and is not counted in length. */
char *buffer_get_string(Buffer *buffer, unsigned int *length_ptr);

/* Stores and arbitrary binary string in the buffer. */
void buffer_put_string(Buffer *buffer, const void *buf, unsigned int len);

#endif /* BUFAUX_H */
