OSDN Git Service

src初コミット
[yurina/yurina.git] / src / core / base / YuriString.cpp
diff --git a/src/core/base/YuriString.cpp b/src/core/base/YuriString.cpp
new file mode 100755 (executable)
index 0000000..969e834
--- /dev/null
@@ -0,0 +1,104 @@
+/*\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