#include "pxx_text_stream.ih"

namespace pxx
{

long TextStream::read_long ()
{
  size_t len = read(buf, sizeof(buf) - 1);
  buf[len] = 0;
  char* end;
  long res = strtol(buf, &end, 0);
  if (errno != 0) throw_sys_error(errno);
  while (buf + len > end) {
    unget(buf[--len]);
  }
  return res;
}

long long TextStream::read_llong ()
{
  size_t len = read(buf, sizeof(buf) - 1);
  buf[len] = 0;
  char* end;
  long long res = strtoll(buf, &end, 0);
  if (errno != 0) throw_sys_error(errno);
  while (buf + len > end) {
    unget(buf[--len]);
  }
  return res;
}

unsigned long TextStream::read_ulong ()
{
  size_t len = read(buf, sizeof(buf) - 1);
  buf[len] = 0;
  char* end;
  unsigned long res = strtoul(buf, &end, 0);
  if (errno != 0) throw_sys_error(errno);
  while (buf + len > end) {
    unget(buf[--len]);
  }
  return res;
}

unsigned long long TextStream::read_ullong ()
{
  size_t len = read(buf, sizeof(buf) - 1);
  buf[len] = 0;
  char* end;
  unsigned long long res = strtoull(buf, &end, 0);
  if (errno != 0) throw_sys_error(errno);
  while (buf + len > end) {
    unget(buf[--len]);
  }
  return res;
}

}
