diff --git a/Foundation/include/Poco/StringTokenizer.h b/Foundation/include/Poco/StringTokenizer.h index 67cc1edaa..61f82202c 100644 --- a/Foundation/include/Poco/StringTokenizer.h +++ b/Foundation/include/Poco/StringTokenizer.h @@ -1,159 +1,157 @@ -// -// StringTokenizer.h -// -// $Id: //poco/1.4/Foundation/include/Poco/StringTokenizer.h#1 $ -// -// Library: Foundation -// Package: Core -// Module: StringTokenizer -// -// Definition of the StringTokenizer class. -// -// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// Permission is hereby granted, free of charge, to any person or organization -// obtaining a copy of the software and accompanying documentation covered by -// this license (the "Software") to use, reproduce, display, distribute, -// execute, and transmit the Software, and to prepare derivative works of the -// Software, and to permit third-parties to whom the Software is furnished to -// do so, all subject to the following: -// -// The copyright notices in the Software and this entire statement, including -// the above license grant, this restriction and the following disclaimer, -// must be included in all copies of the Software, in whole or in part, and -// all derivative works of the Software, unless such copies or derivative -// works are solely in the form of machine-executable object code generated by -// a source language processor. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - - -#ifndef Foundation_StringTokenizer_INCLUDED -#define Foundation_StringTokenizer_INCLUDED - - -#include "Poco/Foundation.h" -#include "Poco/Exception.h" -#include -#include - - -namespace Poco { - - -class Foundation_API StringTokenizer - /// A simple tokenizer that splits a string into - /// tokens, which are separated by separator characters. - /// An iterator is used to iterate over all tokens. -{ -public: - enum Options - { - TOK_IGNORE_EMPTY = 1, /// ignore empty tokens - TOK_TRIM = 2 /// remove leading and trailing whitespace from tokens - }; - - typedef std::vector TokenVec; - typedef TokenVec::const_iterator Iterator; - - StringTokenizer(const std::string& str, const std::string& separators, int options = 0); - /// Splits the given string into tokens. The tokens are expected to be - /// separated by one of the separator characters given in separators. - /// Additionally, options can be specified: - /// * TOK_IGNORE_EMPTY: empty tokens are ignored - /// * TOK_TRIM: trailing and leading whitespace is removed from tokens. - /// An empty token at the end of str is always ignored. For example, - /// a StringTokenizer with the following arguments: - /// StringTokenizer(",ab,cd,", ","); - /// will produce three tokens, "", "ab" and "cd". - - ~StringTokenizer(); - /// Destroys the tokenizer. - - Iterator begin() const; - Iterator end() const; - - const std::string& operator [] (std::size_t index) const; - /// Returns const reference the index'th token. - /// Throws a RangeException if the index is out of range. - - std::string& operator [] (std::size_t index); - /// Returns reference to the index'th token. - /// Throws a RangeException if the index is out of range. - - bool has(const std::string& token) const; - /// Returns true if token exists, false otherwise. - - std::size_t find(const std::string& token, std::size_t pos = 0) const; - /// Returns the index of the first occurence of the token - /// starting at position pos. - /// Throws a NotFoundException if the token is not found. - - std::size_t replace(const std::string& oldToken, const std::string& newToken, std::size_t pos = 0); - /// Starting at position pos, replaces all subsequent tokens having value - /// equal to oldToken with newToken. - /// Returns the number of modified tokens. - - std::size_t count() const; - /// Returns the total number of tokens. - - std::size_t count(const std::string& token) const; - /// Returns the number of tokens equal to the specified token. - -private: - StringTokenizer(const StringTokenizer&); - StringTokenizer& operator = (const StringTokenizer&); - - TokenVec _tokens; -}; - - -// -// inlines -// - - -inline StringTokenizer::Iterator StringTokenizer::begin() const -{ - return _tokens.begin(); -} - - -inline StringTokenizer::Iterator StringTokenizer::end() const -{ - return _tokens.end(); -} - - -inline std::string& StringTokenizer::operator [] (std::size_t index) -{ - if (index >= _tokens.size()) throw RangeException(); - return _tokens[index]; -} - - -inline const std::string& StringTokenizer::operator [] (std::size_t index) const -{ - if (index >= _tokens.size()) throw RangeException(); - return _tokens[index]; -} - - -inline std::size_t StringTokenizer::count() const -{ - return _tokens.size(); -} - - -} // namespace Poco - - -#endif // Foundation_StringTokenizer_INCLUDED +// +// StringTokenizer.h +// +// $Id: //poco/1.4/Foundation/include/Poco/StringTokenizer.h#1 $ +// +// Library: Foundation +// Package: Core +// Module: StringTokenizer +// +// Definition of the StringTokenizer class. +// +// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software, unless such copies or derivative +// works are solely in the form of machine-executable object code generated by +// a source language processor. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// + + +#ifndef Foundation_StringTokenizer_INCLUDED +#define Foundation_StringTokenizer_INCLUDED + + +#include "Poco/Foundation.h" +#include "Poco/Exception.h" +#include +#include + + +namespace Poco { + + +class Foundation_API StringTokenizer + /// A simple tokenizer that splits a string into + /// tokens, which are separated by separator characters. + /// An iterator is used to iterate over all tokens. +{ +public: + enum Options + { + TOK_IGNORE_EMPTY = 1, /// ignore empty tokens + TOK_TRIM = 2 /// remove leading and trailing whitespace from tokens + }; + + typedef std::vector TokenVec; + typedef TokenVec::const_iterator Iterator; + + StringTokenizer(const std::string& str, const std::string& separators, int options = 0); + /// Splits the given string into tokens. The tokens are expected to be + /// separated by one of the separator characters given in separators. + /// Additionally, options can be specified: + /// * TOK_IGNORE_EMPTY: empty tokens are ignored + /// * TOK_TRIM: trailing and leading whitespace is removed from tokens. + + ~StringTokenizer(); + /// Destroys the tokenizer. + + Iterator begin() const; + Iterator end() const; + + const std::string& operator [] (std::size_t index) const; + /// Returns const reference the index'th token. + /// Throws a RangeException if the index is out of range. + + std::string& operator [] (std::size_t index); + /// Returns reference to the index'th token. + /// Throws a RangeException if the index is out of range. + + bool has(const std::string& token) const; + /// Returns true if token exists, false otherwise. + + std::size_t find(const std::string& token, std::size_t pos = 0) const; + /// Returns the index of the first occurence of the token + /// starting at position pos. + /// Throws a NotFoundException if the token is not found. + + std::size_t replace(const std::string& oldToken, const std::string& newToken, std::size_t pos = 0); + /// Starting at position pos, replaces all subsequent tokens having value + /// equal to oldToken with newToken. + /// Returns the number of modified tokens. + + std::size_t count() const; + /// Returns the total number of tokens. + + std::size_t count(const std::string& token) const; + /// Returns the number of tokens equal to the specified token. + +private: + StringTokenizer(const StringTokenizer&); + StringTokenizer& operator = (const StringTokenizer&); + + void trim (std::string& token); + + TokenVec _tokens; +}; + + +// +// inlines +// + + +inline StringTokenizer::Iterator StringTokenizer::begin() const +{ + return _tokens.begin(); +} + + +inline StringTokenizer::Iterator StringTokenizer::end() const +{ + return _tokens.end(); +} + + +inline std::string& StringTokenizer::operator [] (std::size_t index) +{ + if (index >= _tokens.size()) throw RangeException(); + return _tokens[index]; +} + + +inline const std::string& StringTokenizer::operator [] (std::size_t index) const +{ + if (index >= _tokens.size()) throw RangeException(); + return _tokens[index]; +} + + +inline std::size_t StringTokenizer::count() const +{ + return _tokens.size(); +} + + +} // namespace Poco + + +#endif // Foundation_StringTokenizer_INCLUDED diff --git a/Foundation/src/StringTokenizer.cpp b/Foundation/src/StringTokenizer.cpp index a02eeb1e8..43dc8d875 100644 --- a/Foundation/src/StringTokenizer.cpp +++ b/Foundation/src/StringTokenizer.cpp @@ -44,38 +44,35 @@ namespace Poco { StringTokenizer::StringTokenizer(const std::string& str, const std::string& separators, int options) { - std::string::const_iterator it1 = str.begin(); - std::string::const_iterator it2; - std::string::const_iterator it3; + std::string::const_iterator it = str.begin(); std::string::const_iterator end = str.end(); - - while (it1 != end) + std::string token; + bool doTrim = ((options & TOK_TRIM) != 0); + bool ignoreEmpty = ((options & TOK_IGNORE_EMPTY) != 0); + bool lastToken = false; + + for (;it != end; ++it) { - if (options & TOK_TRIM) + if (separators.find(*it) != std::string::npos) { - while (it1 != end && Ascii::isSpace(*it1)) ++it1; - } - it2 = it1; - while (it2 != end && separators.find(*it2) == std::string::npos) ++it2; - it3 = it2; - if (it3 != it1 && (options & TOK_TRIM)) - { - --it3; - while (it3 != it1 && Ascii::isSpace(*it3)) --it3; - if (!Ascii::isSpace(*it3)) ++it3; - } - if (options & TOK_IGNORE_EMPTY) - { - if (it3 != it1) - _tokens.push_back(std::string(it1, it3)); + if (doTrim) trim(token); + if (!token.empty() || !ignoreEmpty)_tokens.push_back(token); + if (!ignoreEmpty) lastToken = true; + token = ""; } else { - _tokens.push_back(std::string(it1, it3)); + token += *it; + lastToken = false; } - it1 = it2; - if (it1 != end) ++it1; } + + if (!token.empty()) + { + if (doTrim) trim(token); + if (!token.empty()) _tokens.push_back(token); + } + else if (lastToken) _tokens.push_back(""); } @@ -84,6 +81,28 @@ StringTokenizer::~StringTokenizer() } +void StringTokenizer::trim (std::string& token) +{ + int front = 0, back = 0, length = token.length(); + std::string::const_iterator tIt = token.begin(); + std::string::const_iterator tEnd = token.end(); + for (; tIt != tEnd; ++tIt, ++front) + { + if (!Ascii::isSpace(*tIt)) break; + } + if (tIt != tEnd) + { + std::string::const_reverse_iterator tRit = token.rbegin(); + std::string::const_reverse_iterator tRend = token.rend(); + for (; tRit != tRend; ++tRit, ++back) + { + if (!Ascii::isSpace(*tRit)) break; + } + } + token = token.substr(front, length - back - front); +} + + std::size_t StringTokenizer::count(const std::string& token) const { std::size_t result = 0; diff --git a/Foundation/testsuite/src/StringTokenizerTest.cpp b/Foundation/testsuite/src/StringTokenizerTest.cpp index 47536a608..bfd091710 100644 --- a/Foundation/testsuite/src/StringTokenizerTest.cpp +++ b/Foundation/testsuite/src/StringTokenizerTest.cpp @@ -133,6 +133,8 @@ void StringTokenizerTest::testStringTokenizer() assert (*it++ == "a"); assert (it != st.end()); assert (*it++ == ""); + assert (it != st.end()); + assert (*it++ == ""); assert (it == st.end()); } { @@ -144,6 +146,8 @@ void StringTokenizerTest::testStringTokenizer() assert (*it++ == "a"); assert (it != st.end()); assert (*it++ == ""); + assert (it != st.end()); + assert (*it++ == ""); assert (it == st.end()); } { @@ -306,6 +310,8 @@ void StringTokenizerTest::testStringTokenizer() assert (*it++ == "ab"); assert (it != st.end()); assert (*it++ == "cd"); + assert (it != st.end()); + assert (*it++ == ""); assert (it == st.end()); } { diff --git a/JSON/JSON_vs100.sln b/JSON/JSON_vs100.sln index 201b5d292..a3f6c5d9f 100644 --- a/JSON/JSON_vs100.sln +++ b/JSON/JSON_vs100.sln @@ -1,60 +1,60 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSON", "JSON_vs100.vcxproj", "{A63135B8-0DFC-428C-AF90-BC020BE83D0C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestSuite", "testsuite\TestSuite_vs100.vcxproj", "{8DDEF92F-2475-410B-8292-1D67B4C6E4A6}" - ProjectSection(ProjectDependencies) = postProject - {A63135B8-0DFC-428C-AF90-BC020BE83D0C} = {A63135B8-0DFC-428C-AF90-BC020BE83D0C} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - debug_shared|Win32 = debug_shared|Win32 - debug_static_md|Win32 = debug_static_md|Win32 - debug_static_mt|Win32 = debug_static_mt|Win32 - release_shared|Win32 = release_shared|Win32 - release_static_md|Win32 = release_static_md|Win32 - release_static_mt|Win32 = release_static_mt|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_shared|Win32.ActiveCfg = debug_shared|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_shared|Win32.Build.0 = debug_shared|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_shared|Win32.Deploy.0 = debug_shared|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_md|Win32.ActiveCfg = debug_static_md|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_md|Win32.Build.0 = debug_static_md|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_md|Win32.Deploy.0 = debug_static_md|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_mt|Win32.ActiveCfg = debug_static_mt|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_mt|Win32.Build.0 = debug_static_mt|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_mt|Win32.Deploy.0 = debug_static_mt|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_shared|Win32.ActiveCfg = release_shared|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_shared|Win32.Build.0 = release_shared|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_shared|Win32.Deploy.0 = release_shared|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_md|Win32.ActiveCfg = release_static_md|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_md|Win32.Build.0 = release_static_md|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_md|Win32.Deploy.0 = release_static_md|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_mt|Win32.ActiveCfg = release_static_mt|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_mt|Win32.Build.0 = release_static_mt|Win32 - {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_mt|Win32.Deploy.0 = release_static_mt|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.debug_shared|Win32.ActiveCfg = debug_shared|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.debug_shared|Win32.Build.0 = debug_shared|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.debug_shared|Win32.Deploy.0 = debug_shared|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.debug_static_md|Win32.ActiveCfg = debug_static_md|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.debug_static_md|Win32.Build.0 = debug_static_md|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.debug_static_md|Win32.Deploy.0 = debug_static_md|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.debug_static_mt|Win32.ActiveCfg = debug_static_mt|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.debug_static_mt|Win32.Build.0 = debug_static_mt|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.debug_static_mt|Win32.Deploy.0 = debug_static_mt|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.release_shared|Win32.ActiveCfg = release_shared|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.release_shared|Win32.Build.0 = release_shared|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.release_shared|Win32.Deploy.0 = release_shared|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.release_static_md|Win32.ActiveCfg = release_static_md|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.release_static_md|Win32.Build.0 = release_static_md|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.release_static_md|Win32.Deploy.0 = release_static_md|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.release_static_mt|Win32.ActiveCfg = release_static_mt|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.release_static_mt|Win32.Build.0 = release_static_mt|Win32 - {8DDEF92F-2475-410B-8292-1D67B4C6E4A6}.release_static_mt|Win32.Deploy.0 = release_static_mt|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSON", "JSON_vs100.vcxproj", "{A63135B8-0DFC-428C-AF90-BC020BE83D0C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestSuite", "testsuite\TestSuite_vs100.vcxproj", "{96CF3103-E49E-3F5E-A11D-6DBCDA043053}" + ProjectSection(ProjectDependencies) = postProject + {A63135B8-0DFC-428C-AF90-BC020BE83D0C} = {A63135B8-0DFC-428C-AF90-BC020BE83D0C} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + debug_shared|Win32 = debug_shared|Win32 + debug_static_md|Win32 = debug_static_md|Win32 + debug_static_mt|Win32 = debug_static_mt|Win32 + release_shared|Win32 = release_shared|Win32 + release_static_md|Win32 = release_static_md|Win32 + release_static_mt|Win32 = release_static_mt|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_shared|Win32.ActiveCfg = debug_shared|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_shared|Win32.Build.0 = debug_shared|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_shared|Win32.Deploy.0 = debug_shared|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_md|Win32.ActiveCfg = debug_static_md|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_md|Win32.Build.0 = debug_static_md|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_md|Win32.Deploy.0 = debug_static_md|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_mt|Win32.ActiveCfg = debug_static_mt|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_mt|Win32.Build.0 = debug_static_mt|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.debug_static_mt|Win32.Deploy.0 = debug_static_mt|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_shared|Win32.ActiveCfg = release_shared|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_shared|Win32.Build.0 = release_shared|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_shared|Win32.Deploy.0 = release_shared|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_md|Win32.ActiveCfg = release_static_md|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_md|Win32.Build.0 = release_static_md|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_md|Win32.Deploy.0 = release_static_md|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_mt|Win32.ActiveCfg = release_static_mt|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_mt|Win32.Build.0 = release_static_mt|Win32 + {A63135B8-0DFC-428C-AF90-BC020BE83D0C}.release_static_mt|Win32.Deploy.0 = release_static_mt|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.debug_shared|Win32.ActiveCfg = debug_shared|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.debug_shared|Win32.Build.0 = debug_shared|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.debug_shared|Win32.Deploy.0 = debug_shared|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.debug_static_md|Win32.ActiveCfg = debug_static_md|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.debug_static_md|Win32.Build.0 = debug_static_md|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.debug_static_md|Win32.Deploy.0 = debug_static_md|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.debug_static_mt|Win32.ActiveCfg = debug_static_mt|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.debug_static_mt|Win32.Build.0 = debug_static_mt|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.debug_static_mt|Win32.Deploy.0 = debug_static_mt|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.release_shared|Win32.ActiveCfg = release_shared|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.release_shared|Win32.Build.0 = release_shared|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.release_shared|Win32.Deploy.0 = release_shared|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.release_static_md|Win32.ActiveCfg = release_static_md|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.release_static_md|Win32.Build.0 = release_static_md|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.release_static_md|Win32.Deploy.0 = release_static_md|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.release_static_mt|Win32.ActiveCfg = release_static_mt|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.release_static_mt|Win32.Build.0 = release_static_mt|Win32 + {96CF3103-E49E-3F5E-A11D-6DBCDA043053}.release_static_mt|Win32.Deploy.0 = release_static_mt|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal