locale_facets.tcc (num_put::_M_widen_int): Deal correctly with grouped, showbased (oct or hex) zero.

2002-09-27  Paolo Carlini  <pcarlini@unitus.it>

	* include/bits/locale_facets.tcc (num_put::_M_widen_int):
	Deal correctly with grouped, showbased (oct or hex) zero.
	* testsuite/22_locale/num_put_members_char.cc: Add test05.
	* testsuite/22_locale/num_put_members_wchar_t.cc: Ditto.

From-SVN: r57598
This commit is contained in:
Paolo Carlini 2002-09-28 01:08:22 +02:00 committed by Paolo Carlini
parent 2a5de0f14b
commit b1af5a30a5
4 changed files with 86 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2002-09-27 Paolo Carlini <pcarlini@unitus.it>
* include/bits/locale_facets.tcc (num_put::_M_widen_int):
Deal correctly with grouped, showbased (oct or hex) zero.
* testsuite/22_locale/num_put_members_char.cc: Add test05.
* testsuite/22_locale/num_put_members_wchar_t.cc: Ditto.
2002-09-27 Richard Henderson <rth@redhat.com>
* config/os/hpux/cpu_limits.h: Remove.

View File

@ -798,8 +798,10 @@ namespace std
// By itself __add_grouping cannot deal correctly with __ws when
// ios::showbase is set and ios_base::oct || ios_base::hex.
// Therefore we take care "by hand" of the initial 0, 0x or 0X.
// However, remember that the latter do not occur if the number
// printed is '0' (__len == 1).
streamsize __off = 0;
if (__io.flags() & ios_base::showbase)
if ((__io.flags() & ios_base::showbase) && __len > 1)
if (__basefield == ios_base::oct)
{
__off = 1;

View File

@ -326,12 +326,50 @@ void test04()
}
}
// Make sure that, in a locale that expects grouping, when showbase
// is true, an hexadecimal or octal zero is correctly output (the case
// of zero is special since there is no 0x, 0 respectively, prefix)
void test05()
{
using namespace std;
bool test = true;
// A locale that expects grouping.
locale loc_de("de_DE");
const string empty;
string result;
ostringstream oss;
oss.imbue(loc_de);
const num_put<char>& np = use_facet<num_put<char> >(oss.getloc());
long l = 0;
oss.str(empty);
oss.clear();
oss.setf(ios::showbase);
oss.setf(ios::hex, ios::basefield);
np.put(oss.rdbuf(), oss, '+', l);
result = oss.str();
VERIFY( result == "0" );
oss.str(empty);
oss.clear();
oss.setf(ios::showbase);
oss.setf(ios::oct, ios::basefield);
np.put(oss.rdbuf(), oss, '+', l);
result = oss.str();
VERIFY( result == "0" );
}
int main()
{
test01();
test02();
test03();
test04();
test05();
return 0;
}

View File

@ -325,6 +325,43 @@ void test04()
VERIFY( preLANG == postLANG );
}
}
// Make sure that, in a locale that expects grouping, when showbase
// is true, an hexadecimal or octal zero is correctly output (the case
// of zero is special since there is no 0x, 0 respectively, prefix)
void test05()
{
using namespace std;
bool test = true;
// A locale that expects grouping.
locale loc_de("de_DE");
const wstring empty;
wstring result;
wostringstream oss;
oss.imbue(loc_de);
const num_put<wchar_t>& np = use_facet<num_put<wchar_t> >(oss.getloc());
long l = 0;
oss.str(empty);
oss.clear();
oss.setf(ios::showbase);
oss.setf(ios::hex, ios::basefield);
np.put(oss.rdbuf(), oss, L'+', l);
result = oss.str();
VERIFY( result == L"0" );
oss.str(empty);
oss.clear();
oss.setf(ios::showbase);
oss.setf(ios::oct, ios::basefield);
np.put(oss.rdbuf(), oss, L'+', l);
result = oss.str();
VERIFY( result == L"0" );
}
#endif
int main()
@ -334,6 +371,7 @@ int main()
test02();
test03();
test04();
test05();
#endif
return 0;
}