--- /dev/null
+/*\r
+ * “yurina”: yurina unpretentious renderer is not an anathema\r
+ *\r
+ * This software is distributed under a BSD-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+#include "base/YuriString.h"\r
+#include "base/yurinaCommon.h"\r
+\r
+namespace yurina\r
+{\r
+\r
+ YuriString::YuriString( const unsigned char *utf8 ) : YuriStringBase()\r
+ {\r
+ Encoding encUtf8( Encoding::UTF8 );\r
+ Encoding::Type defEnc = Encoding::defaultEncoding.getType();\r
+ \r
+ size_t srcSize = encUtf8.countBytes( utf8 ); // byte数\r
+ size_t destSize = Encoding::count( Encoding::UTF8, defEnc, utf8 ); // 文字数\r
+ conversion.resize( destSize * sizeof( YuriChar ) );\r
+ Encoding::convert( Encoding::UTF8, defEnc,\r
+ utf8, conversion.ptr, srcSize, conversion.size );\r
+\r
+ assign( reinterpret_cast<const YuriChar *>( conversion.ptr ), destSize ); \r
+ }\r
+\r
+ YuriString::YuriString( int integer, int base )\r
+ {\r
+\r
+ // ToDo: 基数への対応,安全な処理\r
+ unsigned char buffer[24];\r
+ sprintf( reinterpret_cast<char *>( buffer ), "%d", integer );\r
+\r
+ Encoding encUtf8( Encoding::UTF8 );\r
+ Encoding::Type defEnc = Encoding::defaultEncoding.getType();\r
+\r
+ size_t srcSize = encUtf8.countBytes( buffer ); // byte数\r
+ size_t destSize = Encoding::count( Encoding::UTF8, defEnc, buffer ); // 文字数\r
+ conversion.resize( destSize * sizeof( YuriChar ) );\r
+ Encoding::convert( Encoding::UTF8, defEnc,\r
+ buffer, conversion.ptr, srcSize, conversion.size );\r
+ assign( reinterpret_cast<const YuriChar *>( conversion.ptr ), destSize );\r
+ }\r
+\r
+ YuriString::~YuriString( void )\r
+ {\r
+ conversion.free();\r
+ }\r
+\r
+ const unsigned char *YuriString::utf8( void ) const\r
+ {\r
+ size_t srcSize = size() * sizeof( YuriChar ); // byte数\r
+ conversion.resize( (size() + 1) * 4 ); // Unicodeの定義範囲では1文字4bytesが最大\r
+ size_t destSize = Encoding::convert( Encoding::defaultEncoding.getType(), Encoding::UTF8,\r
+ reinterpret_cast<const unsigned char *>( data() ), conversion.ptr,\r
+ srcSize, conversion.size - 4 );\r
+ conversion.ptr[destSize] = 0; // null-terminated\r
+ return conversion.ptr;\r
+ }\r
+\r
+ YuriChar YuriString::at( off_t pos ) const\r
+ {\r
+ if ( pos < 0 )\r
+ {\r
+ pos += size();\r
+ }\r
+ return YuriStringBase::at( pos );\r
+ }\r
+\r
+ //////////////////////////////////////////////////////////////////////////////\r
+\r
+ YuriString::StringBuffer::StringBuffer( void )\r
+ {\r
+ ptr = NULL;\r
+ size = 0;\r
+ }\r
+\r
+ void YuriString::StringBuffer::allocate( size_t size )\r
+ {\r
+ free();\r
+ // 256byte単位で確保(この数字に根拠はない)\r
+ size_t allocSize = ((size >> 8) + 1) << 8;\r
+ ptr = static_cast<unsigned char *>(_aligned_malloc( allocSize, 16 ));\r
+ this->size = allocSize;\r
+ }\r
+\r
+ void YuriString::StringBuffer::free( void )\r
+ {\r
+ if ( ptr == NULL ) return\r
+ _aligned_free( ptr );\r
+ ptr = NULL;\r
+ size = 0;\r
+ }\r
+\r
+ void YuriString::StringBuffer::resize( size_t size )\r
+ {\r
+ if ( this->size < size )\r
+ {\r
+ allocate( size ); // 内容は破棄される\r
+ }\r
+ }\r
+}\r
+\r