// File:       piscmd04.c++
// Version:    1.00
// Author:     (c) Miles Sabin, 1997
// Purpose:    char extraction command

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

#include "piscmds.h"

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


// Implementation of ExtractCharCommand

ExtractCharCommand::ExtractCharCommand(basic_istream_char& is, bool noskipws)
  { execute_template(is, noskipws); }

ExtractCharCommand::~ExtractCharCommand()
  {}

ios::iostate ExtractCharCommand::execute(basic_istream_char& is)
  {
    c_ = is.rdbuf()->sbumpc();
    return (c_ == basic_istream_char::traits::eof() ? ios::eofbit|ios::failbit : ios::goodbit);
  }


// Implementation of basic_istream_char

int basic_istream_char::get()
  {
    gcount_ = 0;

    ExtractCharCommand cmd(*this, true);

    if(fail())
      return traits::eof();
    else
    {
      gcount_ = 1;
      return cmd.as_int();
    }
  }

basic_istream_char& basic_istream_char::get(char& c)
  {
    gcount_ = 0;

    ExtractCharCommand cmd(*this, true);

    if(!fail())
    {
      gcount_ = 1;
      c = cmd.as_int();
    }

    return *this;
  }


// implementation of basic_istream_char free fns

basic_istream_char& operator>>(basic_istream_char& is, char& c)
{
  ExtractCharCommand cmd(is);
  if(!is.fail())
    c = cmd.as_int();
  return is;
}


