Add locale facet in order to input numbers from wide streams on systems

where sizeof(wchar_t) == 2

	* src/support/docstring.C:
	- New class ascii_num_get_facet for inputting numbers from idocstreams.
	- Add the ascii_num_get_facet facet to the locale initializer.



git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15959 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Enrico Forestieri 2006-11-17 19:27:42 +00:00
parent c66d2f1ee5
commit fa2840e72b

View File

@ -443,6 +443,47 @@ protected:
};
/// Facet for inputting ascii representations of numbers from idocstreams.
/// Here we simply need defining the virtual do_get functions.
class ascii_num_get_facet : public std::num_get<lyx::char_type, std::istreambuf_iterator<lyx::char_type, std::char_traits<lyx::char_type> > >
{
typedef std::istreambuf_iterator<lyx::char_type, std::char_traits<lyx::char_type> > iter_type;
public:
ascii_num_get_facet(size_t refs = 0) : std::num_get<lyx::char_type, iter_type>(refs) {}
/// Facet for converting ascii representation of numbers to a value.
class string_num_get_facet : public std::num_get<char, std::basic_string<char>::iterator>
{
public:
string_num_get_facet() : std::num_get<char, std::basic_string<char>::iterator>(1) {}
};
private:
bool isNumpunct(lyx::char_type const c) const
{
/// Only account for the standard numpunct "C" locale facet.
return c < 0x80 && (c == '-' || c == '+' || isdigit(c)
|| ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')
|| c == 'x' || c == 'X');
}
protected:
iter_type
do_get(iter_type iit, iter_type eit, std::ios_base & b,
std::ios_base::iostate & err, long & v) const
{
std::string s;
s.resize(64);
for (int i = 0; iit != eit && isNumpunct(*iit); ++i, ++iit)
s[i] = static_cast<char>(*iit);
string_num_get_facet f;
f.get(s.begin(), s.end(), b, err, v);
return iit;
}
};
/// class to add our facets to the global locale
class locale_initializer {
public:
@ -451,7 +492,8 @@ public:
std::locale global;
std::locale const loc1(global, new ascii_ctype_facet);
std::locale const loc2(loc1, new ascii_num_put_facet);
std::locale::global(loc2);
std::locale const loc3(loc2, new ascii_num_get_facet);
std::locale::global(loc3);
}
};