1cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 2cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 4cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * you may not use this file except in compliance with the License. 6cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * You may obtain a copy of the License at 7cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 8cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 10cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * See the License for the specific language governing permissions and 14cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * limitations under the License. 15cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 16cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 17cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/String16.h> 18cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 19cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/Log.h> 20ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root#include <utils/Unicode.h> 21cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/String8.h> 22cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/threads.h> 23cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 24cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <memory.h> 25cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <stdio.h> 26cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <ctype.h> 27cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 28d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Giro#include "SharedBuffer.h" 29cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 309a2d83e698b16ec86ad2751b6e7cf103ad645cceKenny Rootnamespace android { 319a2d83e698b16ec86ad2751b6e7cf103ad645cceKenny Root 32cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatic SharedBuffer* gEmptyStringBuf = NULL; 33cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatic char16_t* gEmptyString = NULL; 34cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 35cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatic inline char16_t* getEmptyString() 36cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 37cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project gEmptyStringBuf->acquire(); 38cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return gEmptyString; 39cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 40cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 41cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid initialize_string16() 42cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 43cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::alloc(sizeof(char16_t)); 44cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* str = (char16_t*)buf->data(); 45cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *str = 0; 46cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project gEmptyStringBuf = buf; 47cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project gEmptyString = str; 48cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 49cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 50cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid terminate_string16() 51cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 52cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer::bufferFromData(gEmptyString)->release(); 53cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project gEmptyStringBuf = NULL; 54cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project gEmptyString = NULL; 55cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 56cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 57cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 58cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 59ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Rootstatic char16_t* allocFromUTF8(const char* u8str, size_t u8len) 60cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 61ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root if (u8len == 0) return getEmptyString(); 62ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root 63ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root const uint8_t* u8cur = (const uint8_t*) u8str; 64ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root 65ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root const ssize_t u16len = utf8_to_utf16_length(u8cur, u8len); 66ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root if (u16len < 0) { 67ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root return getEmptyString(); 68cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 69ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root 70ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root SharedBuffer* buf = SharedBuffer::alloc(sizeof(char16_t)*(u16len+1)); 71cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (buf) { 72ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root u8cur = (const uint8_t*) u8str; 73ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root char16_t* u16str = (char16_t*)buf->data(); 74ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root 75ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root utf8_to_utf16(u8cur, u8len, u16str); 769a2d83e698b16ec86ad2751b6e7cf103ad645cceKenny Root 77cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project //printf("Created UTF-16 string from UTF-8 \"%s\":", in); 78cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project //printHexData(1, str, buf->size(), 16, 1); 79cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project //printf("\n"); 80cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 81ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root return u16str; 82cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 83ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root 84cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return getEmptyString(); 85cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 86cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 87cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 88cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 89cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectString16::String16() 90cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project : mString(getEmptyString()) 91cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 92cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 93cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 944485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias AgopianString16::String16(StaticLinkage) 954485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian : mString(0) 964485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian{ 974485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian // this constructor is used when we can't rely on the static-initializers 984485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian // having run. In this case we always allocate an empty string. It's less 994485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian // efficient than using getEmptyString(), but we assume it's uncommon. 1004485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian 1014485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian char16_t* data = static_cast<char16_t*>( 1024485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian SharedBuffer::alloc(sizeof(char16_t))->data()); 1034485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian data[0] = 0; 1044485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian mString = data; 1054485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian} 1064485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian 107cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectString16::String16(const String16& o) 108cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project : mString(o.mString) 109cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 110cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer::bufferFromData(mString)->acquire(); 111cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 112cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 113cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectString16::String16(const String16& o, size_t len, size_t begin) 114cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project : mString(getEmptyString()) 115cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 116cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project setTo(o, len, begin); 117cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 118cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 119cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectString16::String16(const char16_t* o) 120cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 121cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project size_t len = strlen16(o); 122cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::alloc((len+1)*sizeof(char16_t)); 123ae07445e9793724324b93bb593fe20be2a386707Steve Block ALOG_ASSERT(buf, "Unable to allocate shared buffer"); 124cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (buf) { 125cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* str = (char16_t*)buf->data(); 126cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project strcpy16(str, o); 127cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str; 128cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return; 129cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 130cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 131cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = getEmptyString(); 132cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 133cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 134cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectString16::String16(const char16_t* o, size_t len) 135cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 136cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::alloc((len+1)*sizeof(char16_t)); 137ae07445e9793724324b93bb593fe20be2a386707Steve Block ALOG_ASSERT(buf, "Unable to allocate shared buffer"); 138cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (buf) { 139cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* str = (char16_t*)buf->data(); 140cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project memcpy(str, o, len*sizeof(char16_t)); 141cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project str[len] = 0; 142cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str; 143cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return; 144cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 145cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 146cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = getEmptyString(); 147cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 148cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 149cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectString16::String16(const String8& o) 150cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project : mString(allocFromUTF8(o.string(), o.size())) 151cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 152cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 153cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 154cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectString16::String16(const char* o) 155cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project : mString(allocFromUTF8(o, strlen(o))) 156cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 157cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 158cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 159cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectString16::String16(const char* o, size_t len) 160cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project : mString(allocFromUTF8(o, len)) 161cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 162cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 163cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 164cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectString16::~String16() 165cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 166cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer::bufferFromData(mString)->release(); 167cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 168cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 169d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Girosize_t String16::size() const 170d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Giro{ 171d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Giro return SharedBuffer::sizeFromData(mString)/sizeof(char16_t)-1; 172d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Giro} 173d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Giro 174cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid String16::setTo(const String16& other) 175cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 176cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer::bufferFromData(other.mString)->acquire(); 177cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer::bufferFromData(mString)->release(); 178cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = other.mString; 179cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 180cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 181cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::setTo(const String16& other, size_t len, size_t begin) 182cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 183cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t N = other.size(); 184cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (begin >= N) { 185cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer::bufferFromData(mString)->release(); 186cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = getEmptyString(); 187cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 188cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 189cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if ((begin+len) > N) len = N-begin; 190cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (begin == 0 && len == N) { 191cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project setTo(other); 192cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 193cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 194cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 195cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (&other == this) { 196cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project LOG_ALWAYS_FATAL("Not implemented"); 197cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 198cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 199cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return setTo(other.string()+begin, len); 200cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 201cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 202cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::setTo(const char16_t* other) 203cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 204cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return setTo(other, strlen16(other)); 205cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 206cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 207cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::setTo(const char16_t* other, size_t len) 208cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 209cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::bufferFromData(mString) 210cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ->editResize((len+1)*sizeof(char16_t)); 211cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (buf) { 212cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* str = (char16_t*)buf->data(); 2137a4c83922e551506fdc6c5fbca6d107ebdeef867The Android Open Source Project memmove(str, other, len*sizeof(char16_t)); 214cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project str[len] = 0; 215cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str; 216cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 217cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 218cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_MEMORY; 219cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 220cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 221cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::append(const String16& other) 222cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 223cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t myLen = size(); 224cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t otherLen = other.size(); 225cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (myLen == 0) { 226cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project setTo(other); 227cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 228cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } else if (otherLen == 0) { 229cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 230cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 231cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 232cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::bufferFromData(mString) 233cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ->editResize((myLen+otherLen+1)*sizeof(char16_t)); 234cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (buf) { 235cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* str = (char16_t*)buf->data(); 236cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project memcpy(str+myLen, other, (otherLen+1)*sizeof(char16_t)); 237cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str; 238cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 239cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 240cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_MEMORY; 241cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 242cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 243cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::append(const char16_t* chrs, size_t otherLen) 244cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 245cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t myLen = size(); 246cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (myLen == 0) { 247cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project setTo(chrs, otherLen); 248cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 249cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } else if (otherLen == 0) { 250cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 251cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 252cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 253cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::bufferFromData(mString) 254cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ->editResize((myLen+otherLen+1)*sizeof(char16_t)); 255cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (buf) { 256cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* str = (char16_t*)buf->data(); 257cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project memcpy(str+myLen, chrs, otherLen*sizeof(char16_t)); 258cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project str[myLen+otherLen] = 0; 259cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str; 260cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 261cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 262cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_MEMORY; 263cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 264cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 265cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::insert(size_t pos, const char16_t* chrs) 266cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 267cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return insert(pos, chrs, strlen16(chrs)); 268cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 269cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 270cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::insert(size_t pos, const char16_t* chrs, size_t len) 271cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 272cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t myLen = size(); 273cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (myLen == 0) { 274cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return setTo(chrs, len); 275cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 276cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } else if (len == 0) { 277cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 278cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 279cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 280cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (pos > myLen) pos = myLen; 281cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 282cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project #if 0 283cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project printf("Insert in to %s: pos=%d, len=%d, myLen=%d, chrs=%s\n", 284cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8(*this).string(), pos, 285cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project len, myLen, String8(chrs, len).string()); 286cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project #endif 287cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 288cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::bufferFromData(mString) 289cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ->editResize((myLen+len+1)*sizeof(char16_t)); 290cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (buf) { 291cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* str = (char16_t*)buf->data(); 292cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (pos < myLen) { 293cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project memmove(str+pos+len, str+pos, (myLen-pos)*sizeof(char16_t)); 294cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 295cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project memcpy(str+pos, chrs, len*sizeof(char16_t)); 296cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project str[myLen+len] = 0; 297cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str; 298cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project #if 0 299cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project printf("Result (%d chrs): %s\n", size(), String8(*this).string()); 300cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project #endif 301cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 302cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 303cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_MEMORY; 304cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 305cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 306cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t String16::findFirst(char16_t c) const 307cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 308cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char16_t* str = string(); 309cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char16_t* p = str; 310cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char16_t* e = p + size(); 311cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project while (p < e) { 312cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (*p == c) { 313cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return p-str; 314cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 315cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project p++; 316cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 317cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return -1; 318cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 319cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 320cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t String16::findLast(char16_t c) const 321cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 322cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char16_t* str = string(); 323cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char16_t* p = str; 324cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char16_t* e = p + size(); 325cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project while (p < e) { 326cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project e--; 327cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (*e == c) { 328cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return e-str; 329cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 330cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 331cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return -1; 332cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 333cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 334cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectbool String16::startsWith(const String16& prefix) const 335cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 336cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t ps = prefix.size(); 337cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (ps > size()) return false; 338cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strzcmp16(mString, ps, prefix.string(), ps) == 0; 339cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 340cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 341cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectbool String16::startsWith(const char16_t* prefix) const 342cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 343cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t ps = strlen16(prefix); 344cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (ps > size()) return false; 345cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strncmp16(mString, prefix, ps) == 0; 346cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 347cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 3485bacef33c91e9625dfd09ecf638c2de7faecd34eMichael Wrightbool String16::contains(const char16_t* chrs) const 3495bacef33c91e9625dfd09ecf638c2de7faecd34eMichael Wright{ 3505bacef33c91e9625dfd09ecf638c2de7faecd34eMichael Wright return strstr16(mString, chrs) != nullptr; 3515bacef33c91e9625dfd09ecf638c2de7faecd34eMichael Wright} 3525bacef33c91e9625dfd09ecf638c2de7faecd34eMichael Wright 353cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::makeLower() 354cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 355cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t N = size(); 356cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char16_t* str = string(); 357cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* edit = NULL; 358cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project for (size_t i=0; i<N; i++) { 359cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char16_t v = str[i]; 360cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (v >= 'A' && v <= 'Z') { 361cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!edit) { 362cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::bufferFromData(mString)->edit(); 363cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!buf) { 364cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_MEMORY; 365cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 366cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project edit = (char16_t*)buf->data(); 367cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str = edit; 368cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 369cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project edit[i] = tolower((char)v); 370cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 371cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 372cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 373cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 374cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 375cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::replaceAll(char16_t replaceThis, char16_t withThis) 376cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 377cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t N = size(); 378cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char16_t* str = string(); 379cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* edit = NULL; 380cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project for (size_t i=0; i<N; i++) { 381cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (str[i] == replaceThis) { 382cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!edit) { 383cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::bufferFromData(mString)->edit(); 384cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!buf) { 385cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_MEMORY; 386cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 387cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project edit = (char16_t*)buf->data(); 388cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str = edit; 389cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 390cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project edit[i] = withThis; 391cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 392cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 393cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 394cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 395cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 396cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstatus_t String16::remove(size_t len, size_t begin) 397cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 398cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const size_t N = size(); 399cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (begin >= N) { 400cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer::bufferFromData(mString)->release(); 401cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = getEmptyString(); 402cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 403cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 404cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if ((begin+len) > N) len = N-begin; 405cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (begin == 0 && len == N) { 406cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 407cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 408cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 409cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (begin > 0) { 410cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::bufferFromData(mString) 411cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ->editResize((N+1)*sizeof(char16_t)); 412cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!buf) { 413cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_MEMORY; 414cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 415cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* str = (char16_t*)buf->data(); 416cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project memmove(str, str+begin, (N-begin+1)*sizeof(char16_t)); 417cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str; 418cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 419cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SharedBuffer* buf = SharedBuffer::bufferFromData(mString) 420cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ->editResize((len+1)*sizeof(char16_t)); 421cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (buf) { 422cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char16_t* str = (char16_t*)buf->data(); 423cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project str[len] = 0; 424cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mString = str; 425cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_ERROR; 426cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 427cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return NO_MEMORY; 428cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 429cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 430cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; // namespace android 431