Changeset d91b329 in mainline


Ignore:
Timestamp:
2018-07-05T21:41:19Z (6 years ago)
Author:
Dzejrou <dzejrou@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
af8bda0
Parents:
c1e11d32
git-author:
Dzejrou <dzejrou@…> (2017-12-18 12:26:42)
git-committer:
Dzejrou <dzejrou@…> (2018-07-05 21:41:19)
Message:

cpp: implemented the remainder of unformatted input functions of std::basic_istream

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/cpp/include/impl/istream.hpp

    rc1e11d32 rd91b329  
    358358            basic_istream<Char, Traits>& operator>>(basic_streambuf<Char, Traits>* sb)
    359359            {
    360                 // TODO: implement
     360                if (!sb)
     361                {
     362                    this->setstate(ios_base::failbit);
     363                    return *this;
     364                }
     365
     366                gcount_ = 0;
     367                sentry sen{*this, false};
     368
     369                if (sen)
     370                {
     371                    while (true)
     372                    {
     373                        auto ic = this->rdbuf()->sgetc();
     374                        if (traits_type::eq_int_type(ic, traits_type::eof()))
     375                        {
     376                            this->setstate(ios_base::eofbit);
     377                            break;
     378                        }
     379
     380                        auto res = sb->sputc(traits_type::to_char_type(ic));
     381                        if (traits_type::eq_int_type(res, traits_type::eof()))
     382                            break;
     383
     384                        ++gcount_;
     385                        this->rdbuf()->sbumpc();
     386                    }
     387                }
     388
     389                return *this;
    361390            }
    362391
     
    751780                                            Char& c)
    752781    {
    753         // TODO: implement
     782        typename basic_istream<Char, Traits>::sentry sen{is, false};
     783
     784        if (sen)
     785        {
     786            auto ic = is.rdbuf()->sgetc();
     787            if (Traits::eq_int_type(ic, Traits::eof()))
     788            {
     789                is.setstate(ios_base::failbit | ios_base::eofbit);
     790                return is;
     791            }
     792
     793            c = Traits::to_char_type(is.rdbuf()->sbumpc());
     794        }
     795
     796        return is;
    754797    }
    755798
     
    758801                                            unsigned char& c)
    759802    {
    760         // TODO: implement
     803        return is >> static_cast<char&>(c);
    761804    }
    762805
     
    765808                                            signed char& c)
    766809    {
    767         // TODO: implement
     810        return is >> static_cast<char&>(c);
    768811    }
    769812
    770813    template<class Char, class Traits>
    771814    basic_istream<Char, Traits>& operator>>(basic_istream<Char, Traits>& is,
    772                                             Char* c)
     815                                            Char* str)
    773816    {
    774         // TODO: implement
     817        typename basic_istream<Char, Traits>::sentry sen{is, false};
     818
     819        if (sen)
     820        {
     821            const auto& ct = use_facet<ctype<Char>>(is.getloc());
     822
     823            size_t n{};
     824            if (is.width() > 0)
     825                n = static_cast<size_t>(is.width());
     826            else
     827                n = (numeric_limits<size_t>::max() / sizeof(Char)) - sizeof(Char);
     828
     829            size_t i{};
     830            for (; i < n - 1; ++i)
     831            {
     832                auto ic = is.rdbuf()->sgetc();
     833                if (Traits::eq_int_type(ic, Traits::eof()))
     834                    break;
     835
     836                auto c = Traits::to_char_type(ic);
     837                if (ct.is(ctype_base::space, c))
     838                    break;
     839
     840                str[i] = c;
     841                is.rdbuf()->sbumpc();
     842            }
     843
     844            str[i] = Char{};
     845            if (i == 0)
     846                is.setstate(ios_base::failbit);
     847        }
     848
     849        return is;
    775850    }
    776851
    777852    template<class Char, class Traits>
    778853    basic_istream<Char, Traits>& operator>>(basic_istream<Char, Traits>& is,
    779                                             unsigned char* c)
     854                                            unsigned char* str)
    780855    {
    781         // TODO: implement
     856        return is >> static_cast<char*>(str);
    782857    }
    783858
    784859    template<class Char, class Traits>
    785860    basic_istream<Char, Traits>& operator>>(basic_istream<Char, Traits>& is,
    786                                             signed char* c)
     861                                            signed char* str)
    787862    {
    788         // TODO: implement
     863        return is >> static_cast<char*>(str);
    789864    }
    790865
Note: See TracChangeset for help on using the changeset viewer.