swr2.0/
swr2.0/area/
swr2.0/boards/
swr2.0/clans/
swr2.0/doc/
swr2.0/planets/
swr2.0/spacecraft/
#include "swr_support.h"
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#ifdef __cplusplus
extern "C" {
#endif
void bug( const char *str, ... );
#ifdef __cplusplus
}
#endif

/*
 * Create a new buffer.
 */
BUFFER *buffer_new( size_t size )
{
  BUFFER *buffer = (BUFFER*) malloc( sizeof( BUFFER ) );
  buffer->size = size;
  buffer->data = (char*) malloc( size );
  buffer->len = 0;
  return buffer;
}

/*
 * Add a string to a buffer. Expand if necessary
 */
void buffer_strcat( BUFFER *buffer, const char *text )
{
  size_t new_size = 0;
  size_t text_len = 0;
  char *new_data = NULL;

  /* Adding NULL string ? */
  if( !text )
    return;

  text_len = strlen( text );

  /* Adding empty string ? */
  if( text_len == 0 )
    return;

  /* Will the combined len of the added text and the
     current text exceed our buffer? */
  if( ( text_len + buffer->len + 1 ) > buffer->size )
    {
      new_size = buffer->size + text_len + 1;

      /* Allocate the new buffer */
      new_data = (char*) malloc( new_size );

      /* Copy the current buffer to the new buffer */
      memcpy( new_data, buffer->data, buffer->len );
      free( buffer->data );
      buffer->data = new_data;
      buffer->size = new_size;
    }

  memcpy( buffer->data + buffer->len, text, text_len );
  buffer->len += text_len;
  buffer->data[ buffer->len ] = '\0';
}

/* free a buffer */
void buffer_free( BUFFER *buffer )
{
  /* Free data */
  free( buffer->data );

  /* Free buffer */
  free( buffer );
}

/* Clear a buffer's contents, but do not deallocate anything */
void buffer_clear(BUFFER *buffer)
{
  buffer->len = 0;
  buffer->data[0] = '\0';
}

/* print stuff, append to buffer. safe. */
int bprintf( BUFFER *buffer, char *fmt, ... )
{
  char buf[MAX_STRING_LENGTH];
  va_list va;
  int res = 0;

  va_start( va, fmt );
  res = vsnprintf( buf, MAX_STRING_LENGTH, fmt, va );
  va_end( va );

  if( res >= MAX_STRING_LENGTH - 1 )
    {
      buf[0] = '\0';
      bug( "Overflow when printing string %s", fmt );
    }
  else
    {
      buffer_strcat( buffer, buf );
    }

  return res;
}