Blame tests/cxx/t-istream.cc

Packit 5c3484
/* Test istream formatted input.
Packit 5c3484
Packit 5c3484
Copyright 2001-2004 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
This file is part of the GNU MP Library test suite.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is free software; you can redistribute it
Packit 5c3484
and/or modify it under the terms of the GNU General Public License as
Packit 5c3484
published by the Free Software Foundation; either version 3 of the License,
Packit 5c3484
or (at your option) any later version.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is distributed in the hope that it will be
Packit 5c3484
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5c3484
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Packit 5c3484
Public License for more details.
Packit 5c3484
Packit 5c3484
You should have received a copy of the GNU General Public License along with
Packit 5c3484
the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
Packit 5c3484
Packit 5c3484
#include <iostream>
Packit 5c3484
#include <cstdlib>
Packit 5c3484
#include <cstring>
Packit 5c3484
Packit 5c3484
#include "gmp.h"
Packit 5c3484
#include "gmp-impl.h"
Packit 5c3484
#include "tests.h"
Packit 5c3484
Packit 5c3484
using namespace std;
Packit 5c3484
Packit 5c3484
Packit 5c3484
// Under option_check_standard, the various test cases for mpz operator>>
Packit 5c3484
// are put through the standard operator>> for long, and likewise mpf
Packit 5c3484
// operator>> is put through double.
Packit 5c3484
//
Packit 5c3484
// In g++ 3.3 this results in some printouts about the final position
Packit 5c3484
// indicated for something like ".e123".  Our mpf code stops at the "e"
Packit 5c3484
// since there's no mantissa digits, but g++ reads the whole thing and only
Packit 5c3484
// then decides it's bad.
Packit 5c3484
Packit 5c3484
bool option_check_standard = false;
Packit 5c3484
Packit 5c3484
Packit 5c3484
// On some versions of g++ 2.96 it's been observed that putback() may leave
Packit 5c3484
// tellg() unchanged.  We believe this is incorrect and presumably the
Packit 5c3484
// result of a bug, since for instance it's ok in g++ 2.95 and g++ 3.3.  We
Packit 5c3484
// detect the problem at runtime and disable affected checks.
Packit 5c3484
Packit 5c3484
bool putback_tellg_works = true;
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
check_putback_tellg (void)
Packit 5c3484
{
Packit 5c3484
  istringstream input ("hello");
Packit 5c3484
  streampos  old_pos, new_pos;
Packit 5c3484
  char  c;
Packit 5c3484
Packit 5c3484
  input.get(c);
Packit 5c3484
  old_pos = input.tellg();
Packit 5c3484
  input.putback(c);
Packit 5c3484
  new_pos = input.tellg();
Packit 5c3484
Packit 5c3484
  if (old_pos == new_pos)
Packit 5c3484
    {
Packit 5c3484
      cout << "Warning, istringstream has a bug: putback() doesn't update tellg().\n";;
Packit 5c3484
      cout << "Tests on tellg() will be skipped.\n";
Packit 5c3484
      putback_tellg_works = false;
Packit 5c3484
    }
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
Packit 5c3484
#define WRONG(str)                                              \
Packit 5c3484
  do {                                                          \
Packit 5c3484
    cout << str ", data[" << i << "]\n";                        \
Packit 5c3484
    cout << "  input: \"" << data[i].input << "\"\n";           \
Packit 5c3484
    cout << "  flags: " << hex << input.flags() << dec << "\n"; \
Packit 5c3484
  } while (0)
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
check_mpz (void)
Packit 5c3484
{
Packit 5c3484
  static const struct {
Packit 5c3484
    const char     *input;
Packit 5c3484
    int            want_pos;
Packit 5c3484
    const char     *want;
Packit 5c3484
    ios::fmtflags  flags;
Packit 5c3484
Packit 5c3484
  } data[] = {
Packit 5c3484
Packit 5c3484
    { "0",      -1, "0",    (ios::fmtflags) 0 },
Packit 5c3484
    { "123",    -1, "123",  (ios::fmtflags) 0 },
Packit 5c3484
    { "0123",   -1, "83",   (ios::fmtflags) 0 },
Packit 5c3484
    { "0x123",  -1, "291",  (ios::fmtflags) 0 },
Packit 5c3484
    { "-123",   -1, "-123", (ios::fmtflags) 0 },
Packit 5c3484
    { "-0123",  -1, "-83",  (ios::fmtflags) 0 },
Packit 5c3484
    { "-0x123", -1, "-291", (ios::fmtflags) 0 },
Packit 5c3484
    { "+123",   -1, "123", (ios::fmtflags) 0 },
Packit 5c3484
    { "+0123",  -1, "83",  (ios::fmtflags) 0 },
Packit 5c3484
    { "+0x123", -1, "291", (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { "0",     -1, "0",    ios::dec },
Packit 5c3484
    { "1f",     1, "1",    ios::dec },
Packit 5c3484
    { "011f",   3, "11",   ios::dec },
Packit 5c3484
    { "123",   -1, "123",  ios::dec },
Packit 5c3484
    { "-1f",    2, "-1",   ios::dec },
Packit 5c3484
    { "-011f",  4, "-11",  ios::dec },
Packit 5c3484
    { "-123",  -1, "-123", ios::dec },
Packit 5c3484
    { "+1f",    2, "1",    ios::dec },
Packit 5c3484
    { "+011f",  4, "11",   ios::dec },
Packit 5c3484
    { "+123",  -1, "123",  ios::dec },
Packit 5c3484
Packit 5c3484
    { "0",    -1, "0",   ios::oct },
Packit 5c3484
    { "123",  -1, "83",  ios::oct },
Packit 5c3484
    { "-123", -1, "-83", ios::oct },
Packit 5c3484
    { "+123", -1, "83",  ios::oct },
Packit 5c3484
Packit 5c3484
    { "0",    -1, "0",    ios::hex },
Packit 5c3484
    { "123",  -1, "291",  ios::hex },
Packit 5c3484
    { "ff",   -1, "255",  ios::hex },
Packit 5c3484
    { "FF",   -1, "255",  ios::hex },
Packit 5c3484
    { "-123", -1, "-291", ios::hex },
Packit 5c3484
    { "-ff",  -1, "-255", ios::hex },
Packit 5c3484
    { "-FF",  -1, "-255", ios::hex },
Packit 5c3484
    { "+123", -1, "291",  ios::hex },
Packit 5c3484
    { "+ff",  -1, "255",  ios::hex },
Packit 5c3484
    { "+FF",  -1, "255",  ios::hex },
Packit 5c3484
    { "ab",   -1, "171",  ios::hex },
Packit 5c3484
    { "cd",   -1, "205",  ios::hex },
Packit 5c3484
    { "ef",   -1, "239",  ios::hex },
Packit 5c3484
Packit 5c3484
    { " 123",  0, NULL,  (ios::fmtflags) 0 },   // not without skipws
Packit 5c3484
    { " 123", -1, "123", ios::skipws },
Packit 5c3484
  };
Packit 5c3484
Packit 5c3484
  mpz_t      got, want;
Packit 5c3484
  bool       got_ok, want_ok;
Packit 5c3484
  bool       got_eof, want_eof;
Packit 5c3484
  long       got_si, want_si;
Packit 5c3484
  streampos  init_tellg, got_pos, want_pos;
Packit 5c3484
Packit 5c3484
  mpz_init (got);
Packit 5c3484
  mpz_init (want);
Packit 5c3484
Packit 5c3484
  for (size_t i = 0; i < numberof (data); i++)
Packit 5c3484
    {
Packit 5c3484
      size_t input_length = strlen (data[i].input);
Packit 5c3484
      want_pos = (data[i].want_pos == -1
Packit 5c3484
                  ? input_length : data[i].want_pos);
Packit 5c3484
      want_eof = (want_pos == streampos(input_length));
Packit 5c3484
Packit 5c3484
      want_ok = (data[i].want != NULL);
Packit 5c3484
Packit 5c3484
      if (data[i].want != NULL)
Packit 5c3484
        mpz_set_str_or_abort (want, data[i].want, 0);
Packit 5c3484
      else
Packit 5c3484
        mpz_set_ui (want, 0L);
Packit 5c3484
Packit 5c3484
      if (option_check_standard && mpz_fits_slong_p (want))
Packit 5c3484
        {
Packit 5c3484
          istringstream  input (data[i].input);
Packit 5c3484
          input.flags (data[i].flags);
Packit 5c3484
          init_tellg = input.tellg();
Packit 5c3484
          want_si = mpz_get_si (want);
Packit 5c3484
Packit 5c3484
          input >> got_si;
Packit 5c3484
          got_ok = !input.fail();
Packit 5c3484
          got_eof = input.eof();
Packit 5c3484
          input.clear();
Packit 5c3484
          got_pos = input.tellg() - init_tellg;
Packit 5c3484
Packit 5c3484
          if (got_ok != want_ok)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong status, check_mpz");
Packit 5c3484
              cout << "  want_ok: " << want_ok << "\n";
Packit 5c3484
              cout << "  got_ok:  " << got_ok << "\n";
Packit 5c3484
            }
Packit 5c3484
          if (want_ok && got_si != want_si)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong result, check_mpz");
Packit 5c3484
              cout << "  got_si:  " << got_si << "\n";
Packit 5c3484
              cout << "  want_si: " << want_si << "\n";
Packit 5c3484
            }
Packit 5c3484
          if (want_ok && got_eof != want_eof)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong EOF state, check_mpz");
Packit 5c3484
              cout << "  got_eof:  " << got_eof << "\n";
Packit 5c3484
              cout << "  want_eof: " << want_eof << "\n";
Packit 5c3484
            }
Packit 5c3484
          if (putback_tellg_works && got_pos != want_pos)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong position, check_mpz");
Packit 5c3484
              cout << "  want_pos: " << want_pos << "\n";
Packit 5c3484
              cout << "  got_pos:  " << got_pos << "\n";
Packit 5c3484
            }
Packit 5c3484
        }
Packit 5c3484
Packit 5c3484
      {
Packit 5c3484
        istringstream  input (data[i].input);
Packit 5c3484
        input.flags (data[i].flags);
Packit 5c3484
        init_tellg = input.tellg();
Packit 5c3484
Packit 5c3484
        mpz_set_ui (got, 0xDEAD);
Packit 5c3484
        input >> got;
Packit 5c3484
        got_ok = !input.fail();
Packit 5c3484
	got_eof = input.eof();
Packit 5c3484
        input.clear();
Packit 5c3484
        got_pos = input.tellg() - init_tellg;
Packit 5c3484
Packit 5c3484
        if (got_ok != want_ok)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpz operator>> wrong status");
Packit 5c3484
            cout << "  want_ok: " << want_ok << "\n";
Packit 5c3484
            cout << "  got_ok:  " << got_ok << "\n";
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
        if (want_ok && mpz_cmp (got, want) != 0)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpz operator>> wrong result");
Packit 5c3484
            mpz_trace ("  got ", got);
Packit 5c3484
            mpz_trace ("  want", want);
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
        if (want_ok && got_eof != want_eof)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpz operator>> wrong EOF state");
Packit 5c3484
            cout << "  want_eof: " << want_eof << "\n";
Packit 5c3484
            cout << "  got_eof:  " << got_eof << "\n";
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
        if (putback_tellg_works && got_pos != want_pos)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpz operator>> wrong position");
Packit 5c3484
            cout << "  want_pos: " << want_pos << "\n";
Packit 5c3484
            cout << "  got_pos:  " << got_pos << "\n";
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
      }
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  mpz_clear (got);
Packit 5c3484
  mpz_clear (want);
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
check_mpq (void)
Packit 5c3484
{
Packit 5c3484
  static const struct {
Packit 5c3484
    const char     *input;
Packit 5c3484
    int            want_pos;
Packit 5c3484
    const char     *want;
Packit 5c3484
    ios::fmtflags  flags;
Packit 5c3484
Packit 5c3484
  } data[] = {
Packit 5c3484
Packit 5c3484
    { "0",   -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "00",  -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "0x0", -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { "123/456",   -1, "123/456", ios::dec },
Packit 5c3484
    { "0123/456",  -1, "123/456", ios::dec },
Packit 5c3484
    { "123/0456",  -1, "123/456", ios::dec },
Packit 5c3484
    { "0123/0456", -1, "123/456", ios::dec },
Packit 5c3484
Packit 5c3484
    { "123/456",   -1, "83/302", ios::oct },
Packit 5c3484
    { "0123/456",  -1, "83/302", ios::oct },
Packit 5c3484
    { "123/0456",  -1, "83/302", ios::oct },
Packit 5c3484
    { "0123/0456", -1, "83/302", ios::oct },
Packit 5c3484
Packit 5c3484
    { "ab",   -1, "171",  ios::hex },
Packit 5c3484
    { "cd",   -1, "205",  ios::hex },
Packit 5c3484
    { "ef",   -1, "239",  ios::hex },
Packit 5c3484
Packit 5c3484
    { "0/0",     -1, "0/0", (ios::fmtflags) 0 },
Packit 5c3484
    { "5/8",     -1, "5/8", (ios::fmtflags) 0 },
Packit 5c3484
    { "0x5/0x8", -1, "5/8", (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { "123/456",   -1, "123/456",  (ios::fmtflags) 0 },
Packit 5c3484
    { "123/0456",  -1, "123/302",  (ios::fmtflags) 0 },
Packit 5c3484
    { "123/0x456", -1, "123/1110", (ios::fmtflags) 0 },
Packit 5c3484
    { "123/0X456", -1, "123/1110", (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { "0123/123",   -1, "83/123", (ios::fmtflags) 0 },
Packit 5c3484
    { "0123/0123",  -1, "83/83",  (ios::fmtflags) 0 },
Packit 5c3484
    { "0123/0x123", -1, "83/291", (ios::fmtflags) 0 },
Packit 5c3484
    { "0123/0X123", -1, "83/291", (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { "0x123/123",   -1, "291/123", (ios::fmtflags) 0 },
Packit 5c3484
    { "0X123/0123",  -1, "291/83",  (ios::fmtflags) 0 },
Packit 5c3484
    { "0x123/0x123", -1, "291/291", (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { " 123",  0, NULL,  (ios::fmtflags) 0 },   // not without skipws
Packit 5c3484
    { " 123", -1, "123", ios::skipws },
Packit 5c3484
Packit 5c3484
    { "123 /456",    3, "123",  (ios::fmtflags) 0 },
Packit 5c3484
    { "123/ 456",    4,  NULL,  (ios::fmtflags) 0 },
Packit 5c3484
    { "123/"    ,   -1,  NULL,  (ios::fmtflags) 0 },
Packit 5c3484
    { "123 /456",    3, "123",  ios::skipws },
Packit 5c3484
    { "123/ 456",    4,  NULL,  ios::skipws },
Packit 5c3484
  };
Packit 5c3484
Packit 5c3484
  mpq_t      got, want;
Packit 5c3484
  bool       got_ok, want_ok;
Packit 5c3484
  bool       got_eof, want_eof;
Packit 5c3484
  long       got_si, want_si;
Packit 5c3484
  streampos  init_tellg, got_pos, want_pos;
Packit 5c3484
Packit 5c3484
  mpq_init (got);
Packit 5c3484
  mpq_init (want);
Packit 5c3484
Packit 5c3484
  for (size_t i = 0; i < numberof (data); i++)
Packit 5c3484
    {
Packit 5c3484
      size_t input_length = strlen (data[i].input);
Packit 5c3484
      want_pos = (data[i].want_pos == -1
Packit 5c3484
                  ? input_length : data[i].want_pos);
Packit 5c3484
      want_eof = (want_pos == streampos(input_length));
Packit 5c3484
Packit 5c3484
      want_ok = (data[i].want != NULL);
Packit 5c3484
Packit 5c3484
      if (data[i].want != NULL)
Packit 5c3484
        mpq_set_str_or_abort (want, data[i].want, 0);
Packit 5c3484
      else
Packit 5c3484
        mpq_set_ui (want, 0L, 1L);
Packit 5c3484
Packit 5c3484
      if (option_check_standard
Packit 5c3484
          && mpz_fits_slong_p (mpq_numref(want))
Packit 5c3484
          && mpz_cmp_ui (mpq_denref(want), 1L) == 0
Packit 5c3484
          && strchr (data[i].input, '/') == NULL)
Packit 5c3484
        {
Packit 5c3484
          istringstream  input (data[i].input);
Packit 5c3484
          input.flags (data[i].flags);
Packit 5c3484
          init_tellg = input.tellg();
Packit 5c3484
          want_si = mpz_get_si (mpq_numref(want));
Packit 5c3484
Packit 5c3484
          input >> got_si;
Packit 5c3484
          got_ok = !input.fail();
Packit 5c3484
          got_eof = input.eof();
Packit 5c3484
          input.clear();
Packit 5c3484
          got_pos = input.tellg() - init_tellg;
Packit 5c3484
Packit 5c3484
          if (got_ok != want_ok)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong status, check_mpq");
Packit 5c3484
              cout << "  want_ok: " << want_ok << "\n";
Packit 5c3484
              cout << "  got_ok:  " << got_ok << "\n";
Packit 5c3484
            }
Packit 5c3484
          if (want_ok && want_si != got_si)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong result, check_mpq");
Packit 5c3484
              cout << "  got_si:  " << got_si << "\n";
Packit 5c3484
              cout << "  want_si: " << want_si << "\n";
Packit 5c3484
            }
Packit 5c3484
          if (want_ok && got_eof != want_eof)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong EOF state, check_mpq");
Packit 5c3484
              cout << "  got_eof:  " << got_eof << "\n";
Packit 5c3484
              cout << "  want_eof: " << want_eof << "\n";
Packit 5c3484
            }
Packit 5c3484
          if (putback_tellg_works && got_pos != want_pos)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong position, check_mpq");
Packit 5c3484
              cout << "  want_pos: " << want_pos << "\n";
Packit 5c3484
              cout << "  got_pos:  " << got_pos << "\n";
Packit 5c3484
            }
Packit 5c3484
        }
Packit 5c3484
Packit 5c3484
      {
Packit 5c3484
        istringstream  input (data[i].input);
Packit 5c3484
        input.flags (data[i].flags);
Packit 5c3484
        init_tellg = input.tellg();
Packit 5c3484
        mpq_set_si (got, 0xDEAD, 0xBEEF);
Packit 5c3484
Packit 5c3484
        input >> got;
Packit 5c3484
        got_ok = !input.fail();
Packit 5c3484
	got_eof = input.eof();
Packit 5c3484
        input.clear();
Packit 5c3484
        got_pos = input.tellg() - init_tellg;
Packit 5c3484
Packit 5c3484
        if (got_ok != want_ok)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpq operator>> wrong status");
Packit 5c3484
            cout << "  want_ok: " << want_ok << "\n";
Packit 5c3484
            cout << "  got_ok:  " << got_ok << "\n";
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
        // don't use mpq_equal, since we allow non-normalized values to be
Packit 5c3484
        // read, which can trigger ASSERTs in mpq_equal
Packit 5c3484
        if (want_ok && (mpz_cmp (mpq_numref (got), mpq_numref(want)) != 0
Packit 5c3484
                        || mpz_cmp (mpq_denref (got), mpq_denref(want)) != 0))
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpq operator>> wrong result");
Packit 5c3484
            mpq_trace ("  got ", got);
Packit 5c3484
            mpq_trace ("  want", want);
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
        if (want_ok && got_eof != want_eof)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpq operator>> wrong EOF state");
Packit 5c3484
            cout << "  want_eof: " << want_eof << "\n";
Packit 5c3484
            cout << "  got_eof:  " << got_eof << "\n";
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
        if (putback_tellg_works && got_pos != want_pos)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpq operator>> wrong position");
Packit 5c3484
            cout << "  want_pos: " << want_pos << "\n";
Packit 5c3484
            cout << "  got_pos:  " << got_pos << "\n";
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
      }
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  mpq_clear (got);
Packit 5c3484
  mpq_clear (want);
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
Packit 5c3484
void
Packit 5c3484
check_mpf (void)
Packit 5c3484
{
Packit 5c3484
  static const struct {
Packit 5c3484
    const char     *input;
Packit 5c3484
    int            want_pos;
Packit 5c3484
    const char     *want;
Packit 5c3484
    ios::fmtflags  flags;
Packit 5c3484
Packit 5c3484
  } data[] = {
Packit 5c3484
Packit 5c3484
    { "0",      -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "+0",     -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "-0",     -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "0.0",    -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "0.",     -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { ".0",     -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "+.0",    -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "-.0",    -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "+0.00",  -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "-0.000", -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "+0.00",  -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "-0.000", -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "0.0e0",  -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "0.e0",   -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { ".0e0",   -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "0.0e-0", -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "0.e-0",  -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { ".0e-0",  -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "0.0e+0", -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { "0.e+0",  -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
    { ".0e+0",  -1, "0", (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { "1",  -1,  "1", (ios::fmtflags) 0 },
Packit 5c3484
    { "+1", -1,  "1", (ios::fmtflags) 0 },
Packit 5c3484
    { "-1", -1, "-1", (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { " 0",  0,  NULL, (ios::fmtflags) 0 },  // not without skipws
Packit 5c3484
    { " 0",  -1, "0", ios::skipws },
Packit 5c3484
    { " +0", -1, "0", ios::skipws },
Packit 5c3484
    { " -0", -1, "0", ios::skipws },
Packit 5c3484
Packit 5c3484
    { "+-123", 1, NULL, (ios::fmtflags) 0 },
Packit 5c3484
    { "-+123", 1, NULL, (ios::fmtflags) 0 },
Packit 5c3484
    { "1e+-123", 3, NULL, (ios::fmtflags) 0 },
Packit 5c3484
    { "1e-+123", 3, NULL, (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { "e123",   0, NULL, (ios::fmtflags) 0 }, // at least one mantissa digit
Packit 5c3484
    { ".e123",  1, NULL, (ios::fmtflags) 0 },
Packit 5c3484
    { "+.e123", 2, NULL, (ios::fmtflags) 0 },
Packit 5c3484
    { "-.e123", 2, NULL, (ios::fmtflags) 0 },
Packit 5c3484
Packit 5c3484
    { "123e",   4, NULL, (ios::fmtflags) 0 }, // at least one exponent digit
Packit 5c3484
    { "123e-",  5, NULL, (ios::fmtflags) 0 },
Packit 5c3484
    { "123e+",  5, NULL, (ios::fmtflags) 0 },
Packit 5c3484
  };
Packit 5c3484
Packit 5c3484
  mpf_t      got, want;
Packit 5c3484
  bool       got_ok, want_ok;
Packit 5c3484
  bool       got_eof, want_eof;
Packit 5c3484
  double     got_d, want_d;
Packit 5c3484
  streampos  init_tellg, got_pos, want_pos;
Packit 5c3484
Packit 5c3484
  mpf_init (got);
Packit 5c3484
  mpf_init (want);
Packit 5c3484
Packit 5c3484
  for (size_t i = 0; i < numberof (data); i++)
Packit 5c3484
    {
Packit 5c3484
      size_t input_length = strlen (data[i].input);
Packit 5c3484
      want_pos = (data[i].want_pos == -1
Packit 5c3484
                  ? input_length : data[i].want_pos);
Packit 5c3484
      want_eof = (want_pos == streampos(input_length));
Packit 5c3484
Packit 5c3484
      want_ok = (data[i].want != NULL);
Packit 5c3484
Packit 5c3484
      if (data[i].want != NULL)
Packit 5c3484
        mpf_set_str_or_abort (want, data[i].want, 0);
Packit 5c3484
      else
Packit 5c3484
        mpf_set_ui (want, 0L);
Packit 5c3484
Packit 5c3484
      want_d = mpf_get_d (want);
Packit 5c3484
      if (option_check_standard && mpf_cmp_d (want, want_d) == 0)
Packit 5c3484
        {
Packit 5c3484
          istringstream  input (data[i].input);
Packit 5c3484
          input.flags (data[i].flags);
Packit 5c3484
          init_tellg = input.tellg();
Packit 5c3484
Packit 5c3484
          input >> got_d;
Packit 5c3484
          got_ok = !input.fail();
Packit 5c3484
          got_eof = input.eof();
Packit 5c3484
          input.clear();
Packit 5c3484
          got_pos = input.tellg() - init_tellg;
Packit 5c3484
Packit 5c3484
          if (got_ok != want_ok)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong status, check_mpf");
Packit 5c3484
              cout << "  want_ok: " << want_ok << "\n";
Packit 5c3484
              cout << "  got_ok:  " << got_ok << "\n";
Packit 5c3484
            }
Packit 5c3484
          if (want_ok && want_d != got_d)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong result, check_mpf");
Packit 5c3484
              cout << "  got:   " << got_d << "\n";
Packit 5c3484
              cout << "  want:  " << want_d << "\n";
Packit 5c3484
            }
Packit 5c3484
          if (want_ok && got_eof != want_eof)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong EOF state, check_mpf");
Packit 5c3484
              cout << "  got_eof:  " << got_eof << "\n";
Packit 5c3484
              cout << "  want_eof: " << want_eof << "\n";
Packit 5c3484
            }
Packit 5c3484
          if (putback_tellg_works && got_pos != want_pos)
Packit 5c3484
            {
Packit 5c3484
              WRONG ("stdc++ operator>> wrong position, check_mpf");
Packit 5c3484
              cout << "  want_pos: " << want_pos << "\n";
Packit 5c3484
              cout << "  got_pos:  " << got_pos << "\n";
Packit 5c3484
            }
Packit 5c3484
        }
Packit 5c3484
Packit 5c3484
      {
Packit 5c3484
        istringstream  input (data[i].input);
Packit 5c3484
        input.flags (data[i].flags);
Packit 5c3484
        init_tellg = input.tellg();
Packit 5c3484
Packit 5c3484
        mpf_set_ui (got, 0xDEAD);
Packit 5c3484
        input >> got;
Packit 5c3484
        got_ok = !input.fail();
Packit 5c3484
	got_eof = input.eof();
Packit 5c3484
        input.clear();
Packit 5c3484
        got_pos = input.tellg() - init_tellg;
Packit 5c3484
Packit 5c3484
        if (got_ok != want_ok)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpf operator>> wrong status");
Packit 5c3484
            cout << "  want_ok: " << want_ok << "\n";
Packit 5c3484
            cout << "  got_ok:  " << got_ok << "\n";
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
        if (want_ok && mpf_cmp (got, want) != 0)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpf operator>> wrong result");
Packit 5c3484
            mpf_trace ("  got ", got);
Packit 5c3484
            mpf_trace ("  want", want);
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
        if (want_ok && got_eof != want_eof)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpf operator>> wrong EOF state");
Packit 5c3484
            cout << "  want_eof: " << want_eof << "\n";
Packit 5c3484
            cout << "  got_eof:  " << got_eof << "\n";
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
        if (putback_tellg_works && got_pos != want_pos)
Packit 5c3484
          {
Packit 5c3484
            WRONG ("mpf operator>> wrong position");
Packit 5c3484
            cout << "  want_pos: " << want_pos << "\n";
Packit 5c3484
            cout << "  got_pos:  " << got_pos << "\n";
Packit 5c3484
            abort ();
Packit 5c3484
          }
Packit 5c3484
      }
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  mpf_clear (got);
Packit 5c3484
  mpf_clear (want);
Packit 5c3484
}
Packit 5c3484
Packit 5c3484
Packit 5c3484
Packit 5c3484
int
Packit 5c3484
main (int argc, char *argv[])
Packit 5c3484
{
Packit 5c3484
  if (argc > 1 && strcmp (argv[1], "-s") == 0)
Packit 5c3484
    option_check_standard = true;
Packit 5c3484
Packit 5c3484
  tests_start ();
Packit 5c3484
Packit 5c3484
  check_putback_tellg ();
Packit 5c3484
  check_mpz ();
Packit 5c3484
  check_mpq ();
Packit 5c3484
  check_mpf ();
Packit 5c3484
Packit 5c3484
  tests_end ();
Packit 5c3484
  return 0;
Packit 5c3484
}