Author: martinf Date: Sat May 5 11:30:20 2007 New Revision: 26646
URL: http://svn.reactos.org/svn/reactos?rev=26646&view=rev Log: update to XMLStorage version 1.2
Modified: trunk/reactos/base/shell/explorer/utility/xmlstorage.cpp trunk/reactos/base/shell/explorer/utility/xmlstorage.h trunk/reactos/base/shell/explorer/utility/xs-native.cpp
Modified: trunk/reactos/base/shell/explorer/utility/xmlstorage.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/utility... ============================================================================== --- trunk/reactos/base/shell/explorer/utility/xmlstorage.cpp (original) +++ trunk/reactos/base/shell/explorer/utility/xmlstorage.cpp Sat May 5 11:30:20 2007 @@ -1,8 +1,8 @@
// - // XML storage classes Version 1.1 + // XML storage classes version 1.2 // - // Copyright (c) 2004, 2005, 2006 Martin Fuchs martin-fuchs@gmx.net + // Copyright (c) 2004, 2005, 2006, 2007 Martin Fuchs martin-fuchs@gmx.net //
/// \file xmlstorage.cpp @@ -284,30 +284,43 @@ LPCXSSTR s = str.c_str(); size_t l = XS_len(s);
- if (!cdata && l<=BUFFER_LEN) { + if (cdata) { + // encode the whole string in a CDATA section + std::string ret = "<![CDATA["; + +#ifdef XS_STRING_UTF8 + ret += str; +#else + ret += get_utf8(str); +#endif + + ret += "]]>"; + + return ret; + } else if (l <= BUFFER_LEN) { LPXSSTR buffer = (LPXSSTR)alloca(6*sizeof(XS_CHAR)*XS_len(s)); // worst case """ / "'" LPXSSTR o = buffer;
for(LPCXSSTR p=s; *p; ++p) switch(*p) { case '&': - *o++ = '&'; *o++ = 'a'; *o++ = 'm'; *o++ = 'p'; *o++ = ';'; + *o++ = '&'; *o++ = 'a'; *o++ = 'm'; *o++ = 'p'; *o++ = ';'; // "&" break;
case '<': - *o++ = '&'; *o++ = 'l'; *o++ = 't'; *o++ = ';'; + *o++ = '&'; *o++ = 'l'; *o++ = 't'; *o++ = ';'; // "<" break;
case '>': - *o++ = '&'; *o++ = 'g'; *o++ = 't'; *o++ = ';'; + *o++ = '&'; *o++ = 'g'; *o++ = 't'; *o++ = ';'; // ">" break;
case '"': - *o++ = '&'; *o++ = 'q'; *o++ = 'u'; *o++ = 'o'; *o++ = 't'; *o++ = ';'; + *o++ = '&'; *o++ = 'q'; *o++ = 'u'; *o++ = 'o'; *o++ = 't'; *o++ = ';'; // """ break;
case ''': - *o++ = '&'; *o++ = 'a'; *o++ = 'p'; *o++ = 'o'; *o++ = 's'; *o++ = ';'; + *o++ = '&'; *o++ = 'a'; *o++ = 'p'; *o++ = 'o'; *o++ = 's'; *o++ = ';'; // "'" break;
default: @@ -326,23 +339,9 @@ return get_utf8(buffer, o-buffer); #endif } else { // l > BUFFER_LEN - // encode the whole string in a CDATA section - std::string ret = "<![CDATA["; - -#ifdef XS_STRING_UTF8 - ret += str; -#else - ret += get_utf8(str); -#endif - - ret += "]]>"; - - return ret; - -/* alternative code using ostringstream (beware: quite slow) -#include <sstream> - - std::ostringstream out; + // alternative code for larger strings using ostringstream + // and avoiding to use alloca() for preallocated memory + fast_ostringstream out;
LPCXSSTR s = str.c_str();
@@ -369,7 +368,7 @@ break;
default: - if ((unsigned)*p<20 && *p!='\t' *p!='\r' && *p!='\n') + if ((unsigned)*p<20 && *p!='\t' && *p!='\r' && *p!='\n') out << "&" << (unsigned)*p << ";"; else out << *p; @@ -380,7 +379,6 @@ #else return get_utf8(out.str()); #endif - */ } }
@@ -417,7 +415,7 @@ size_t l = e - p; memcpy(o, p, l); o += l; - p += 3; + p = e + 2; } else *o++ = *p; } else @@ -761,11 +759,15 @@ const char* p = s; const char* e = p + _content.length();
- for(; p<e; ++p) - if (*p == '\n') { - ++p; - break; - } + if (!strncmp(s,"<![CDATA[",9) && !strncmp(e-3,"]]>",3)) { + s += 9; + p = (e-=3); + } else + for(; p<e; ++p) + if (*p == '\n') { + ++p; + break; + }
if (p != s) if (_pos->_children.empty()) // no children in current node?
Modified: trunk/reactos/base/shell/explorer/utility/xmlstorage.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/utility... ============================================================================== --- trunk/reactos/base/shell/explorer/utility/xmlstorage.h (original) +++ trunk/reactos/base/shell/explorer/utility/xmlstorage.h Sat May 5 11:30:20 2007 @@ -1,8 +1,8 @@
// - // XML storage classes Version 1.1 + // XML storage classes version 1.2 // - // Copyright (c) 2004, 2005, 2006 Martin Fuchs martin-fuchs@gmx.net + // Copyright (c) 2004, 2005, 2006, 2007 Martin Fuchs martin-fuchs@gmx.net //
/// \file xmlstorage.h @@ -40,6 +40,26 @@ #ifndef _XMLSTORAGE_H
+#ifdef UNICODE +#ifndef _UNICODE +#define _UNICODE +#endif +#else +#ifdef _UNICODE +#define UNICODE +#endif +#endif + +#ifndef _WIN32 +#ifdef UNICODE +#error no UNICODE build in Unix version available +#endif +#ifndef XS_STRING_UTF8 +#define XS_STRING_UTF8 +#endif +#endif + + #if _MSC_VER>=1400 #ifndef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 @@ -129,20 +149,54 @@ #endif // _MSC_VER
-#ifdef UNICODE -#ifndef _UNICODE -#define _UNICODE -#endif -#else -#ifdef _UNICODE -#define UNICODE -#endif -#endif +#ifdef _WIN32
#include <windows.h> // for LPCTSTR - #include <tchar.h> #include <malloc.h> + +#else + +#include <wchar.h> +#include <stdarg.h> + +typedef char CHAR; +#ifdef _WCHAR_T_DEFINED +#define __wchar_t wchar_t +#endif + +typedef __wchar_t WCHAR; +typedef unsigned char UCHAR; +typedef char* LPSTR; +typedef const char* LPCSTR; +typedef WCHAR* LPWSTR; +typedef const WCHAR* LPCWSTR; + +#ifndef UNICODE +#define TEXT(x) x +typedef char TCHAR; +typedef unsigned char _TUCHAR; +typedef CHAR* PTSTR; +typedef CHAR* LPTSTR; +typedef const CHAR* LPCTSTR; + +#define _ttoi atoi +#define _tfopen fopen +#define _tcstod strtod +#define _tcslen strlen +#define _tcsstr strstr +#define _snprintf snprintf +#define _sntprintf snprintf +#define _vsnprintf vsnprintf +#define _vsntprintf vsnprintf +#define _stricmp strcasecmp +#define _tcsicmp strcasecmp +#define strnicmp strncasecmp +#define _tcsnicmp strncasecmp +#endif + +#endif +
#include <fstream> #include <sstream> @@ -168,7 +222,7 @@ #define LPXSSTR LPSTR #define LPCXSSTR LPCSTR #define XS_cmp strcmp -#define XS_icmp stricmp +#define XS_icmp _stricmp #define XS_ncmp strncmp #define XS_nicmp strnicmp #define XS_toi atoi @@ -238,6 +292,7 @@ XS_String(const super& other) : super(other) {} XS_String(const XS_String& other) : super(other) {}
+#ifdef _WIN32 #if defined(UNICODE) && !defined(XS_STRING_UTF8) XS_String(LPCSTR s) {assign(s);} XS_String(LPCSTR s, size_t l) {assign(s, l);} @@ -251,7 +306,6 @@ XS_String(const std::wstring& other) {assign(other.c_str());} XS_String& operator=(LPCWSTR s) {assign(s); return *this;} #ifdef XS_STRING_UTF8 - void assign(const XS_String& s) {assign(s.c_str());} void assign(LPCWSTR s) {if (s) {size_t bl=wcslen(s); LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_UTF8, 0, s, (int)bl, b, (int)bl, 0, 0));} else erase();} void assign(LPCWSTR s, size_t l) {size_t bl=l; if (s) {LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_UTF8, 0, s, (int)l, b, (int)bl, 0, 0));} else erase();} #else // if !UNICODE && !XS_STRING_UTF8 @@ -259,6 +313,11 @@ void assign(LPCWSTR s, size_t l) {size_t bl=l; if (s) {LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, (int)l, b, (int)bl, 0, 0));} else erase();} #endif #endif +#endif // _WIN32 + +#ifdef XS_STRING_UTF8 + void assign(const XS_String& s) {assign(s.c_str());} +#endif
XS_String& operator=(LPCXSSTR s) {if (s) super::assign(s); else erase(); return *this;} XS_String& operator=(const super& s) {super::assign(s); return *this;} @@ -267,12 +326,14 @@
operator LPCXSSTR() const {return c_str();}
+#ifdef _WIN32 #ifdef XS_STRING_UTF8 operator std::wstring() const {size_t bl=length(); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); return std::wstring(b, MultiByteToWideChar(CP_UTF8, 0, c_str(), bl, b, bl));} #elif defined(UNICODE) operator std::string() const {size_t bl=length(); LPSTR b=(LPSTR)alloca(bl); return std::string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), bl, b, bl, 0, 0));} #else operator std::wstring() const {size_t bl=length(); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); return std::wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), (int)bl, b, (int)bl));} +#endif #endif
XS_String& printf(LPCXSSTR fmt, ...) @@ -950,7 +1011,7 @@ #endif
/// write node with children tree to output stream - std::ostream& write(std::ostream& out, const XMLFormat& format, WRITE_MODE mode=FORMAT_SMART, int indent=0) const + bool write(std::ostream& out, const XMLFormat& format, WRITE_MODE mode=FORMAT_SMART, int indent=0) const { switch(mode) { case FORMAT_PLAIN: @@ -969,7 +1030,7 @@ smart_write_worker(out, format, indent); }
- return out; + return out.good(); }
protected: @@ -2136,6 +2197,102 @@ #endif // XS_USE_XERCES
+#if defined(_MSC_VER) && _MSC_VER<1400 + +struct fast_ostringbuffer : public std::streambuf +{ + typedef char _E; + typedef std::char_traits<_E> _Tr; + + explicit fast_ostringbuffer() + {_Init(0, 0, std::_Noread);} // optimized for ios::out mode + + virtual ~fast_ostringbuffer() + {_Tidy();} + + std::string str() const + {if (pptr() != 0) + {std::string _Str(pbase(), + (_Seekhigh<pptr()? pptr(): _Seekhigh) - pbase()); + return _Str;} + else + return std::string();} + +protected: + virtual int_type overflow(int_type _C = _Tr::eof()) + {if (_Tr::eq_int_type(_Tr::eof(), _C)) + return _Tr::not_eof(_C); + else if (pptr() != 0 && pptr() < epptr()) + {*_Pninc() = _Tr::to_char_type(_C); + return _C;} + else + {size_t _Os = gptr() == 0 ? 0 : epptr() - eback(); + size_t _Ns = _Os + _Alsize; + _E *_P = _Al.allocate(_Ns, (void *)0); + if (0 < _Os) + _Tr::copy(_P, eback(), _Os); + else if (_ALSIZE < _Alsize) + _Alsize = _ALSIZE; + + if (_Strmode & std::_Allocated) + _Al.deallocate(eback(), _Os); + + _Strmode |= std::_Allocated; + + if (_Os == 0) + {_Seekhigh = _P; + setp(_P, _P + _Ns); + setg(_P, _P, _P); } + else + {_Seekhigh = _Seekhigh - eback() + _P; + setp(pbase() - eback() + _P, pptr() - eback() + _P, _P + _Ns); + setg(_P, _P, _P);} + *_Pninc() = _Tr::to_char_type(_C); + + return _C;}} + + void _Init(const _E *_S, size_t _N, std::_Strstate _M) + {_Pendsave = 0, _Seekhigh = 0; + _Alsize = _MINSIZE, _Strmode = _M; + setg(0, 0, 0); + setp(0, 0);} + + void _Tidy() + {if (_Strmode & std::_Allocated) + _Al.deallocate(eback(), (pptr() != 0 ? epptr() : egptr()) - eback()); + _Seekhigh = 0; + _Strmode &= ~std::_Allocated;} + +private: + enum {_ALSIZE = 65536/*512*/, _MINSIZE = 32768/*32*/}; // bigger buffer sizes + + _E *_Pendsave, *_Seekhigh; + int _Alsize; + std::_Strstate _Strmode; + std::allocator<_E> _Al; +}; + +struct fast_ostringstream : public std::iostream +{ + typedef std::iostream super; + + explicit fast_ostringstream() + : super(&_Sb) {} + + std::string str() const + {return _Sb.str();} + +private: + fast_ostringbuffer _Sb; +}; + +#else + +typedef std::ostringstream fast_ostringstream; + +#endif + + /// XML document holder struct XMLDoc : public XMLNode { @@ -2221,18 +2378,22 @@ }
/// write XML stream preserving previous white space and comments - std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART) const + bool write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART) const { _format.print_header(out, mode!=FORMAT_PLAIN);
- if (!_children.empty()) + if (_children.size() == 1) _children.front()->write(out, _format, mode); - - return out; + else if (!_children.empty()) { + //throw Exception("more than one XML root!"); + return false; + } + + return out.good(); }
/// write XML stream with formating - std::ostream& write_formating(std::ostream& out) const + bool write_formating(std::ostream& out) const { return write(out, FORMAT_PRETTY); } @@ -2241,14 +2402,14 @@ { tofstream out(path);
- return write(out, mode).good(); + return write(out, mode); }
bool write_formating(LPCTSTR path) const { tofstream out(path);
- return write_formating(out).good(); + return write_formating(out); }
XMLFormat _format;
Modified: trunk/reactos/base/shell/explorer/utility/xs-native.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/utility... ============================================================================== --- trunk/reactos/base/shell/explorer/utility/xs-native.cpp (original) +++ trunk/reactos/base/shell/explorer/utility/xs-native.cpp Sat May 5 11:30:20 2007 @@ -1,8 +1,8 @@
// - // XML storage classes Version 1.1 + // XML storage classes version 1.2 // - // Copyright (c) 2006 Martin Fuchs martin-fuchs@gmx.net + // Copyright (c) 2006, 2007 Martin Fuchs martin-fuchs@gmx.net //
/// \file xs-native.cpp @@ -109,10 +109,14 @@
const std::string& str(bool utf8) // returns UTF-8 encoded buffer content { +#if defined(_WIN32) && !defined(XS_STRING_UTF8) if (utf8) +#endif _buffer_str.assign(_buffer, _wptr-_buffer); +#if defined(_WIN32) && !defined(XS_STRING_UTF8) else _buffer_str = get_utf8(_buffer, _wptr-_buffer); +#endif
return _buffer_str; }