// file : xsde/cxx/parser/validating/string-common.cxx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #include #include namespace xsde { namespace cxx { namespace parser { namespace validating { bool string_common:: validate_facets ( #ifdef XSDE_STL std::string& str, #else string& str, #endif const string_facets::facets& f, context& ctx) { #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; } } #ifdef XSDE_STL const char* s = str.c_str (); #else const char* s = str.data (); #endif size_t n = str.size (); if (f.length_set_ && n != f.length_) { ctx.schema_error (schema_error::length_not_equal_prescribed); return false; } if (f.min_length_set_ && n < f.min_length_) { ctx.schema_error (schema_error::length_less_than_min); return false; } if (f.max_length_set_ && n > f.max_length_) { ctx.schema_error (schema_error::length_greater_than_max); return false; } if (f.enum_count_ != 0) { size_t i = search (f.enum_, f.enum_count_, s); if (i == f.enum_count_) { ctx.schema_error (schema_error::value_not_in_enumeration); return false; } } return true; } } } } }