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