#include <errno.h>
#include <string.h>
#include <unistd.h>
#include "iobuf.h"

int obuf_write_large(obuf* out, const char* data, unsigned datalen)
{
  iobuf* io;
  unsigned wr;
  
  io = &out->io;
  if (iobuf_bad(io)) return 0;
  out->count = 0;
  if (!obuf_flush(out)) return 0;
  
  while (datalen > 0) {
    if (io->timeout && !iobuf_timeout(io, 1)) return 0;
    if ((wr = out->writefn(io->fd, data, datalen)) == (unsigned)-1)
      IOBUF_SET_ERROR(io);
    datalen -= wr;
    data += wr;
    io->offset += wr;
    out->count += wr;
  }
  return 1;
}

int obuf_write(obuf* out, const char* data, unsigned datalen)
{
  iobuf* io;
  unsigned avail;
  
  io = &out->io;
  if (iobuf_bad(io)) return 0;
  if (datalen >= io->bufsize) return obuf_write_large(out, data, datalen);

  out->count = 0;
  avail = io->bufsize - out->bufpos;
  while (datalen >= avail) {
    memcpy(io->buffer+out->bufpos, data, avail);
    out->bufpos = io->bufsize;
    io->buflen = io->bufsize;
    datalen -= avail;
    data += avail;
    if (!obuf_flush(out)) return 0;
    out->count += avail;
    avail = io->bufsize - out->bufpos;
  }
  
  memcpy(io->buffer+out->bufpos, data, datalen);
  out->count += datalen;
  out->bufpos += datalen;
  if (out->bufpos > io->buflen) io->buflen = out->bufpos;
  return 1;
}


syntax highlighted by Code2HTML, v. 0.9.1