#ifdef UNIX
#  include <malloc.h>
#else
#  include <stdlib.h>
#endif

#include <stdio.h>
#include <string.h>
#include "IncrementalLine.h"


IncrementalLine::IncrementalLine() 
{
  _endToken = '\n';
  _allocIncr = 100;
  _nAllocd = 0;

  if ((_buf = (char *)malloc(_allocIncr)) == 0) {
    fprintf(stderr, 
	    "IncrementalLine::IncrementalLine() - malloc() failed\n");

    exit(1);
  }

  _nAllocd += _allocIncr;

  reset();
  return;
}


IncrementalLine::~IncrementalLine()
{
  if (_nAllocd)
    free((void *)_buf);
}

void IncrementalLine::reset()
{
  _complete = FALSE;
  _nChars = 0;
  memset((void *)_buf, 0, _nAllocd);
}


int IncrementalLine::addChar(char c)
{
  if (_complete) {
    return -1;
  }

  if (_nChars >= _nAllocd) {
    // Have to enlarge memory buffer
    _nAllocd += _allocIncr;
    char *ptr = (char *)realloc(_buf, _nAllocd);

    if (!ptr) {
      fprintf(stderr, 
	      "IncrementalLine::addChar() - realloc() failed\n");
      exit(1);
    }

    _buf = ptr;
  }

  _buf[_nChars++] = c;
  if (c == _endToken)
    _complete = TRUE;

  return 0;
}



const char *IncrementalLine::buf()
{
  return (const char *)_buf;
}

