• R/O
  • SSH
  • HTTPS

qrobosdk: コミット


コミットメタ情報

リビジョン1798 (tree)
日時2010-04-23 03:10:52
作者satofumi

ログメッセージ

fixed Utf8::substr() bug

変更サマリ

差分

--- trunk/libs/input/TestUtf8.cpp (revision 1797)
+++ trunk/libs/input/TestUtf8.cpp (revision 1798)
@@ -113,6 +113,9 @@
113113 CPPUNIT_ASSERT_EQUAL(string("あい"), string(actual.substr(0, 2).c_str()));
114114
115115 actual = Utf8("あいう");
116+ CPPUNIT_ASSERT_EQUAL(string("あいう"), string(actual.substr(0, 3).c_str()));
117+
118+ actual = Utf8("あいう");
116119 CPPUNIT_ASSERT_EQUAL(string("あ"), string(actual.substr(0, 1).c_str()));
117120
118121 actual = Utf8("あいう");
--- trunk/libs/input/Utf8.cpp (revision 1797)
+++ trunk/libs/input/Utf8.cpp (revision 1798)
@@ -37,8 +37,8 @@
3737 struct Utf8::pImpl
3838 {
3939 string utf8_text_;
40+ string c_string_;
4041 vector<size_t> index_;
41- string c_string_;
4242
4343
4444 pImpl(const string& utf8_text) : utf8_text_(utf8_text)
@@ -55,6 +55,26 @@
5555 }
5656 return index_[index];
5757 }
58+
59+
60+ const char* c_str(void)
61+ {
62+ c_string_.clear();
63+
64+ size_t n = index_.size();
65+ for (size_t i = 0; i < n; ++i) {
66+ size_t index = utf8_index(i);
67+ const unsigned short ch = utf8_text_[index];
68+ if (ch & 0xff00) {
69+ c_string_.push_back(ch);
70+ c_string_.push_back(utf8_text_[index + 1]);
71+ c_string_.push_back(utf8_text_[index + 2]);
72+ } else {
73+ c_string_.push_back(ch);
74+ }
75+ }
76+ return c_string_.c_str();
77+ }
5878 };
5979
6080
@@ -71,6 +91,7 @@
7191 Utf8& Utf8::operator = (const Utf8& rhs)
7292 {
7393 this->pimpl->utf8_text_ = rhs.pimpl->utf8_text_;
94+ //this->pimpl->c_string_ = rhs.pimpl->c_string_;
7495 this->pimpl->index_ = rhs.pimpl->index_;
7596
7697 return *this;
@@ -128,21 +149,7 @@
128149
129150 const char* Utf8::c_str(void)
130151 {
131- pimpl->c_string_.clear();
132-
133- size_t n = pimpl->index_.size();
134- for (size_t i = 0; i < n; ++i) {
135- size_t index = pimpl->utf8_index(i);
136- const unsigned short ch = pimpl->utf8_text_[index];
137- if (ch & 0xff00) {
138- pimpl->c_string_.push_back(ch);
139- pimpl->c_string_.push_back(pimpl->utf8_text_[index + 1]);
140- pimpl->c_string_.push_back(pimpl->utf8_text_[index + 2]);
141- } else {
142- pimpl->c_string_.push_back(ch);
143- }
144- }
145- return pimpl->c_string_.c_str();
152+ return pimpl->c_str();
146153 }
147154
148155
@@ -150,11 +157,17 @@
150157 {
151158 // 指定された文字の位置から指定されたサイズだけ文字を格納していく
152159 size_t raw_first_index = pimpl->index_[first_index];
153- size_t raw_last_index = min(first_index + n, pimpl->index_.size());
154- raw_last_index = pimpl->index_[raw_last_index];
155160
161+ // 末尾に格納する次の文字の先頭位置を計算し、その1つ前の文字までを格納する
162+ size_t last_index = first_index + n;
163+ size_t raw_last_index;
164+ if (last_index >= pimpl->index_.size()) {
165+ raw_last_index = pimpl->utf8_text_.size();
166+ } else {
167+ raw_last_index = pimpl->index_[last_index] - 1;
168+ }
156169 return Utf8(pimpl->utf8_text_.substr(raw_first_index,
157- raw_last_index - raw_first_index));
170+ raw_last_index + 1 - raw_first_index));
158171 }
159172
160173
旧リポジトリブラウザで表示