AAPT2: Remove usage of u16string
For legacy reasons, we kept around the use of UTF-16 internally
in AAPT2. We don't need this and this CL removes all instances of
std::u16string and StringPiece16. The only places still needed
are when interacting with the ResTable APIs that only operate in
UTF16.
Change-Id: I492475b84bb9014fa13bf992cff447ee7a5fe588
diff --git a/tools/aapt2/StringPool.cpp b/tools/aapt2/StringPool.cpp
index aadb00b..fe4b967 100644
--- a/tools/aapt2/StringPool.cpp
+++ b/tools/aapt2/StringPool.cpp
@@ -59,11 +59,11 @@
return *this;
}
-const std::u16string* StringPool::Ref::operator->() const {
+const std::string* StringPool::Ref::operator->() const {
return &mEntry->value;
}
-const std::u16string& StringPool::Ref::operator*() const {
+const std::string& StringPool::Ref::operator*() const {
return mEntry->value;
}
@@ -124,15 +124,15 @@
return mEntry->str.getContext();
}
-StringPool::Ref StringPool::makeRef(const StringPiece16& str) {
+StringPool::Ref StringPool::makeRef(const StringPiece& str) {
return makeRefImpl(str, Context{}, true);
}
-StringPool::Ref StringPool::makeRef(const StringPiece16& str, const Context& context) {
+StringPool::Ref StringPool::makeRef(const StringPiece& str, const Context& context) {
return makeRefImpl(str, context, true);
}
-StringPool::Ref StringPool::makeRefImpl(const StringPiece16& str, const Context& context,
+StringPool::Ref StringPool::makeRefImpl(const StringPiece& str, const Context& context,
bool unique) {
if (unique) {
auto iter = mIndexedStrings.find(str);
@@ -147,7 +147,7 @@
entry->index = mStrings.size();
entry->ref = 0;
mStrings.emplace_back(entry);
- mIndexedStrings.insert(std::make_pair(StringPiece16(entry->value), entry));
+ mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
return Ref(entry);
}
@@ -162,13 +162,12 @@
entry->index = mStrings.size();
entry->ref = 0;
mStrings.emplace_back(entry);
- mIndexedStrings.insert(std::make_pair(StringPiece16(entry->value), entry));
+ mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
StyleEntry* styleEntry = new StyleEntry();
styleEntry->str = Ref(entry);
for (const aapt::Span& span : str.spans) {
- styleEntry->spans.emplace_back(Span{makeRef(span.name),
- span.firstChar, span.lastChar});
+ styleEntry->spans.emplace_back(Span{ makeRef(span.name), span.firstChar, span.lastChar });
}
styleEntry->ref = 0;
mStyles.emplace_back(styleEntry);
@@ -182,7 +181,7 @@
entry->index = mStrings.size();
entry->ref = 0;
mStrings.emplace_back(entry);
- mIndexedStrings.insert(std::make_pair(StringPiece16(entry->value), entry));
+ mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
StyleEntry* styleEntry = new StyleEntry();
styleEntry->str = Ref(entry);
@@ -320,33 +319,40 @@
indices++;
if (utf8) {
- std::string encoded = util::utf16ToUtf8(entry->value);
+ const std::string& encoded = entry->value;
+ const ssize_t utf16Length = utf8_to_utf16_length(
+ reinterpret_cast<const uint8_t*>(entry->value.data()), entry->value.size());
+ assert(utf16Length >= 0);
- const size_t totalSize = encodedLengthUnits<char>(entry->value.size())
+ const size_t totalSize = encodedLengthUnits<char>(utf16Length)
+ encodedLengthUnits<char>(encoded.length())
+ encoded.size() + 1;
char* data = out->nextBlock<char>(totalSize);
- // First encode the actual UTF16 string length.
- data = encodeLength(data, entry->value.size());
+ // First encode the UTF16 string length.
+ data = encodeLength(data, utf16Length);
- // Now encode the size of the converted UTF8 string.
+ // Now encode the size of the real UTF8 string.
data = encodeLength(data, encoded.length());
strncpy(data, encoded.data(), encoded.size());
+
} else {
- const size_t totalSize = encodedLengthUnits<char16_t>(entry->value.size())
- + entry->value.size() + 1;
+ const std::u16string encoded = util::utf8ToUtf16(entry->value);
+ const ssize_t utf16Length = encoded.size();
+
+ // Total number of 16-bit words to write.
+ const size_t totalSize = encodedLengthUnits<char16_t>(utf16Length) + encoded.size() + 1;
char16_t* data = out->nextBlock<char16_t>(totalSize);
// Encode the actual UTF16 string length.
- data = encodeLength(data, entry->value.size());
- const size_t byteLength = entry->value.size() * sizeof(char16_t);
+ data = encodeLength(data, utf16Length);
+ const size_t byteLength = encoded.size() * sizeof(char16_t);
// NOTE: For some reason, strncpy16(data, entry->value.data(), entry->value.size())
// truncates the string.
- memcpy(data, entry->value.data(), byteLength);
+ memcpy(data, encoded.data(), byteLength);
// The null-terminating character is already here due to the block of data being set
// to 0s on allocation.