// File:       piscmd09.c++
// Version:    1.00
// Author:     (c) Miles Sabin, 1997
// Purpose:    readsome command

// Change log:
//  27/03/97   v. 1.00

#include "piscmds.h"

#include "istream.h"
#include "streambuf.h"


// Implementation of ReadSomeCommand

ReadSomeCommand::ReadSomeCommand(basic_istream_char& is, char* s, streamsize n)
  : s_(s),
    n_(n),
    gcount_(0)
  { execute_template(is, true); }

ReadSomeCommand::~ReadSomeCommand()
  {}

ios::iostate ReadSomeCommand::execute(basic_istream_char& is)
  {
    int avail = is.rdbuf()->in_avail();

    if(avail < 0)
      return ios::eofbit;
    else if(avail == 0)
      return ios::goodbit;

    if(avail < n_)
      n_ = avail;

    return ((gcount_ = is.rdbuf()->sgetn(s_, n_)) != n_ ? ios::failbit : ios::goodbit);
  }


// Implementation of basic_istream_char

streamsize basic_istream_char::readsome(char* s, streamsize n)
  {
    gcount_ = 0;

    ReadSomeCommand cmd(*this, s, n);
    gcount_ = cmd.gcount();

    return gcount_;
  }

