diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-10-08 15:35:23 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-10-08 15:35:23 +0200 |
commit | 7db026e8056914d113ac0bbfd9bdc4908a9e7874 (patch) | |
tree | 0ab15cb8b0ee160a10cca21edaf0aca1e97e8921 /libxsde/xsde/cxx/parser/non-validating/string-common.cxx | |
parent | 4f38adc11ab1a3a1ab2dd3f958c917182be7d71f (diff) |
Add support for the whiteSpace facet
Use the same mechanism to handle whitespace processing for build-in types
and enumerations.
Diffstat (limited to 'libxsde/xsde/cxx/parser/non-validating/string-common.cxx')
-rw-r--r-- | libxsde/xsde/cxx/parser/non-validating/string-common.cxx | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/libxsde/xsde/cxx/parser/non-validating/string-common.cxx b/libxsde/xsde/cxx/parser/non-validating/string-common.cxx new file mode 100644 index 0000000..f4ba502 --- /dev/null +++ b/libxsde/xsde/cxx/parser/non-validating/string-common.cxx @@ -0,0 +1,84 @@ +// file : xsde/cxx/parser/non-validating/string-common.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <xsde/cxx/parser/non-validating/string-common.hxx> + +namespace xsde +{ + namespace cxx + { + namespace parser + { + namespace non_validating + { + void string_common:: + process_facets ( +#ifdef XSDE_STL + std::string& str, +#else + string& str, +#endif + const string_facets::facets& f) + { +#ifdef XSDE_STL + typedef std::string::size_type size_type; +#else + typedef string::size_type size_type; +#endif + + if (f.whitespace_ == 2) + { + // Collapse. The left trimming has already been performed. + // + size_type size = str.size (); + size_type j = 0; + + bool subs = false; + + for (size_type i = 0; i < size; ++i) + { + char c = str[i]; + + if (c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09) + { + subs = true; + } + else + { + if (subs) + { + subs = false; + str[j++] = 0x20; + } + + str[j++] = c; + } + } + +#ifdef XSDE_STL + str.resize (j); +#else + str.truncate (j); +#endif + } + else if (f.whitespace_ == 1) + { + // Replace. + // + size_type size = str.size (); + + for (size_type i = 0; i < size; ++i) + { + char& c = str[i]; + + if (c == 0x0A || c == 0x0D || c == 0x09) + c = 0x20; + } + } + } + } + } + } +} |