locale_facets.tcc (money_get::do_get(string)): First construct a tentative returned string...

2002-02-05  Paolo Carlini  <pcarlini@unitus.it>

	* include/bits/locale_facets.tcc (money_get::do_get(string)):
	First construct a tentative returned string, then, only if the
	parsing succeeds, copy it into the string passed by reference.
	* testsuite/22_locale/money_get_members_char.cc: Add test06.
	* testsuite/22_locale/money_get_members_wchar_t.cc: Add test06.

From-SVN: r49523
This commit is contained in:
Paolo Carlini 2002-02-05 12:35:48 +01:00 committed by Paolo Carlini
parent 4505024e9e
commit e07554eb17
4 changed files with 94 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2002-02-05 Paolo Carlini <pcarlini@unitus.it>
* include/bits/locale_facets.tcc (money_get::do_get(string)):
First construct a tentative returned string, then, only if the
parsing succeeds, copy it into the string passed by reference.
* testsuite/22_locale/money_get_members_char.cc: Add test06.
* testsuite/22_locale/money_get_members_wchar_t.cc: Add test06.
2002-02-04 Phil Edwards <pme@gcc.gnu.org>
* docs/doxygen/TODO: Impl-defined behavior now documented...

View File

@ -930,6 +930,9 @@ namespace std
// Flag marking when a decimal point is found.
bool __testdecfound = false;
// The tentative returned string is stored here.
string_type __temp_units;
char_type __c = *__beg;
char_type __eof = static_cast<char_type>(char_traits<char_type>::eof());
for (int __i = 0; __beg != __end && __i < 4 && __testvalid; ++__i)
@ -1019,7 +1022,7 @@ namespace std
}
else
{
__units += __c;
__temp_units += __c;
++__sep_pos;
}
__c = *(++__beg);
@ -1050,11 +1053,11 @@ namespace std
}
// Strip leading zeros.
while (__units[0] == __ctype.widen('0'))
__units.erase(__units.begin());
while (__temp_units[0] == __ctype.widen('0'))
__temp_units.erase(__temp_units.begin());
if (__sign.size() && __sign == __neg_sign)
__units.insert(__units.begin(), __ctype.widen('-'));
__temp_units.insert(__temp_units.begin(), __ctype.widen('-'));
// Test for grouping fidelity.
if (__grouping.size() && __grouping_tmp.size())
@ -1068,8 +1071,12 @@ namespace std
__err |= ios_base::eofbit;
// Iff valid sequence is not recognized.
if (!__testvalid || !__units.size())
if (!__testvalid || !__temp_units.size())
__err |= ios_base::failbit;
else
// Use the "swap trick" to copy __temp_units into __units.
__temp_units.swap(__units);
return __beg;
}

View File

@ -383,6 +383,42 @@ void test05()
VERIFY( valn_ns == "-123456" );
}
void test06()
{
using namespace std;
typedef istreambuf_iterator<char> InIt;
InIt iend1, iend2, iend3;
locale loc;
string buffer1("123");
string buffer2("456");
string buffer3("Golgafrincham"); // From Nathan's original idea.
string val;
ios_base::iostate err;
const money_get<char,InIt>& mg =
use_facet<money_get<char, InIt> >(loc);
istringstream fmt1(buffer1);
InIt ibeg1(fmt1);
mg.get(ibeg1,iend1,false,fmt1,err,val);
VERIFY( val == buffer1 );
istringstream fmt2(buffer2);
InIt ibeg2(fmt2);
mg.get(ibeg2,iend2,false,fmt2,err,val);
VERIFY( val == buffer2 );
val = buffer3;
istringstream fmt3(buffer3);
InIt ibeg3(fmt3);
mg.get(ibeg3,iend3,false,fmt3,err,val);
VERIFY( val == buffer3 );
}
int main()
{
test01();
@ -390,5 +426,6 @@ int main()
test03();
test04();
test05();
test06();
return 0;
}

View File

@ -384,6 +384,42 @@ void test05()
mg.get(ibegn_ns,iendn_ns,intl,fmtn_ns,err,valn_ns);
VERIFY( valn_ns == L"-123456" );
}
void test06()
{
using namespace std;
typedef istreambuf_iterator<wchar_t> InIt;
InIt iend1, iend2, iend3;
locale loc;
wstring buffer1(L"123");
wstring buffer2(L"456");
wstring buffer3(L"Golgafrincham");
wstring val;
ios_base::iostate err;
const money_get<wchar_t,InIt>& mg =
use_facet<money_get<wchar_t, InIt> >(loc);
wistringstream fmt1(buffer1);
InIt ibeg1(fmt1);
mg.get(ibeg1,iend1,false,fmt1,err,val);
VERIFY( val == buffer1 );
wistringstream fmt2(buffer2);
InIt ibeg2(fmt2);
mg.get(ibeg2,iend2,false,fmt2,err,val);
VERIFY( val == buffer2 );
val = buffer3;
wistringstream fmt3(buffer3);
InIt ibeg3(fmt3);
mg.get(ibeg3,iend3,false,fmt3,err,val);
VERIFY( val == buffer3 );
}
#endif
int main()
@ -394,6 +430,7 @@ int main()
test03();
test04();
test05();
test06();
#endif
return 0;
}