#include "happyio.h"
#include <err.h>

//
// fileWriter
//

fileWriter::fileWriter(FILE *fp)
  : fp(fp)
{
}

void
fileWriter::write(const void *x, int size)
{
  fwrite(x, size, 1, fp);
}

bool
fileWriter::hasError()
{
  return ferror(fp);
}

//
// fileReader
//

fileReader::fileReader(FILE *fp)
  : fp(fp)
{
}

void
fileReader::read(void *x, int size)
{
  fread(x, size, 1, fp);
}

bool
fileReader::hasError()
{
  return ferror(fp);
}

bool
fileReader::eos()
{
  return feof(fp);
}

//
// strWriter
//

strWriter::strWriter()
{
}

void
strWriter::write(const void *x, int size)
{
  buf.copy(x, size);
}

bool
strWriter::hasError()
{
  return false;
}

str
strWriter::getStr()
{
  return str(buf);
}

//
// strReader
//

strReader::strReader(str s, int offset)
  : s(s), offset(offset), eosFlag(false)
{
}

void
strReader::read(void *x, int size)
{
  if ((unsigned)(offset+size) > s.len()) {
    // End of stream
    offset = s.len();
    eosFlag = true;
    return;
  }

  bcopy(s.cstr()+offset, x, size);
  offset += size;
}

bool
strReader::hasError()
{
  return false;
}

bool
strReader::eos()
{
  return eosFlag;
}
