aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/parser/non-validating/string-common.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-10-08 15:35:23 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-10-08 15:35:23 +0200
commit7db026e8056914d113ac0bbfd9bdc4908a9e7874 (patch)
tree0ab15cb8b0ee160a10cca21edaf0aca1e97e8921 /libxsde/xsde/cxx/parser/non-validating/string-common.cxx
parent4f38adc11ab1a3a1ab2dd3f958c917182be7d71f (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.cxx84
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;
+ }
+ }
+ }
+ }
+ }
+ }
+}