172961230a5890071bcca436eb5630172ce84ec41Andreas Huber/* 272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Copyright (C) 2010 The Android Open Source Project 372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 572961230a5890071bcca436eb5630172ce84ec41Andreas Huber * you may not use this file except in compliance with the License. 672961230a5890071bcca436eb5630172ce84ec41Andreas Huber * You may obtain a copy of the License at 772961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 872961230a5890071bcca436eb5630172ce84ec41Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 972961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 1072961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Unless required by applicable law or agreed to in writing, software 1172961230a5890071bcca436eb5630172ce84ec41Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * See the License for the specific language governing permissions and 1472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * limitations under the License. 1572961230a5890071bcca436eb5630172ce84ec41Andreas Huber */ 1672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1789b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen#define LOG_TAG "AString" 1889b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen#include <utils/Log.h> 1989b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen 2072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <ctype.h> 2172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <stdarg.h> 2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <stdio.h> 2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <stdlib.h> 2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <string.h> 2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 268accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar#include <binder/Parcel.h> 27bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar#include <utils/String8.h> 2872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h" 2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h" 3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3172961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 3272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber// static 3472961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst char *AString::kEmptyString = ""; 3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3672961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString() 3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData((char *)kEmptyString), 3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4272961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const char *s) 4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 4689b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen if (!s) { 4789b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen ALOGW("ctor got NULL, using empty string instead"); 4889b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen clear(); 4989b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen } else { 5089b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen setTo(s); 5189b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen } 5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5472961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const char *s, size_t size) 5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 5889b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen if (!s) { 5989b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen ALOGW("ctor got NULL, using empty string instead"); 6089b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen clear(); 6189b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen } else { 6289b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen setTo(s, size); 6389b2a0ad367cdff5ff4e70036311ecf82921a829Marco Nelissen } 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 66bcf08569453dcb42730cda3230d5d375a697005bLajos MolnarAString::AString(const String8 &from) 67bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar : mData(NULL), 68bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar mSize(0), 69bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar mAllocSize(1) { 70bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar setTo(from.string(), from.length()); 71bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar} 72bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar 7372961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const AString &from) 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, 0, from.size()); 7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8072961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const AString &from, size_t offset, size_t n) 8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, offset, n); 8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8772961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::~AString() { 8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9172961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString &AString::operator=(const AString &from) { 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (&from != this) { 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, 0, from.size()); 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return *this; 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9972961230a5890071bcca436eb5630172ce84ec41Andreas Hubersize_t AString::size() const { 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize; 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst char *AString::c_str() const { 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mData; 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::empty() const { 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize == 0; 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const char *s) { 11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s, strlen(s)); 11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const char *s, size_t size) { 11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s, size); 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const AString &from, size_t offset, size_t n) { 12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(&from != this); 12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from.mData + offset, n); 12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::clear() { 12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mData && mData != kEmptyString) { 12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber free(mData); 13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = NULL; 13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)kEmptyString; 13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize = 0; 13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = 1; 13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13872961230a5890071bcca436eb5630172ce84ec41Andreas Hubersize_t AString::hash() const { 13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t x = 0; 14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mSize; ++i) { 14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber x = (x * 31) + mData[i]; 14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return x; 14572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 14672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator==(const AString &other) const { 14872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize == other.mSize && !memcmp(mData, other.mData, mSize); 14972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::trim() { 15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t i = 0; 15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (i < mSize && isspace(mData[i])) { 15672961230a5890071bcca436eb5630172ce84ec41Andreas Huber ++i; 15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t j = mSize; 16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (j > i && isspace(mData[j - 1])) { 16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber --j; 16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16472961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(mData, &mData[i], j - i); 16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize = j - i; 16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::erase(size_t start, size_t n) { 17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LT(start, mSize); 17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(start + n, mSize); 17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(&mData[start], &mData[start + n], mSize - start - n); 17672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize -= n; 17772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 17872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::makeMutable() { 18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mData == kEmptyString) { 18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = strdup(kEmptyString); 18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const char *s) { 18772961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s, strlen(s)); 18872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const char *s, size_t size) { 19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19372961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mSize + size + 1 > mAllocSize) { 19472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = (mAllocSize + size + 31) & -32; 19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)realloc(mData, mAllocSize); 19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mData != NULL); 19772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber memcpy(&mData[mSize], s, size); 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize += size; 20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const AString &from) { 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(from.c_str(), from.size()); 20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const AString &from, size_t offset, size_t n) { 20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(from.c_str() + offset, n); 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(int x) { 21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 214ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%d", x); 215ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 21672961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 21772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned x) { 22072961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 221ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%u", x); 222ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 22372961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 22472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(long x) { 227ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland char s[32]; 228ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%ld", x); 229ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned long x) { 234ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland char s[32]; 235ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%lu", x); 236ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 23772961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 23872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(long long x) { 24172961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[32]; 242ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%lld", x); 243ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 24472961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 24572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 24672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned long long x) { 24872961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[32]; 249ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%llu", x); 250ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 25172961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 25272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 25372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 25472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(float x) { 25572961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 256ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%f", x); 257ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 25872961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 25972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(double x) { 26272961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 263ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%f", x); 264ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 26572961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 26672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 26772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(void *x) { 269ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland char s[32]; 270ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%p", x); 271ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 27272961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 27372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 27472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27572961230a5890071bcca436eb5630172ce84ec41Andreas Huberssize_t AString::find(const char *substring, size_t start) const { 27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(start, size()); 27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *match = strstr(mData + start, substring); 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (match == NULL) { 28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return -1; 28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return match - mData; 28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::insert(const AString &from, size_t insertionPos) { 28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber insert(from.c_str(), from.size(), insertionPos); 28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::insert(const char *from, size_t size, size_t insertionPos) { 29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_GE(insertionPos, 0u); 29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(insertionPos, mSize); 29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mSize + size + 1 > mAllocSize) { 29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = (mAllocSize + size + 31) & -32; 29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)realloc(mData, mAllocSize); 30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mData != NULL); 30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(&mData[insertionPos + size], 30472961230a5890071bcca436eb5630172ce84ec41Andreas Huber &mData[insertionPos], mSize - insertionPos + 1); 30572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30672961230a5890071bcca436eb5630172ce84ec41Andreas Huber memcpy(&mData[insertionPos], from, size); 30772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize += size; 30972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 31072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 31172961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator<(const AString &other) const { 31272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return compare(other) < 0; 31372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 31472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 31572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator>(const AString &other) const { 31672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return compare(other) > 0; 31772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 31872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 31972961230a5890071bcca436eb5630172ce84ec41Andreas Huberint AString::compare(const AString &other) const { 32072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return strcmp(mData, other.mData); 32172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 32272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3238accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnarint AString::compareIgnoreCase(const AString &other) const { 3248accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar return strcasecmp(mData, other.mData); 3258accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar} 3268accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar 3278accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnarbool AString::equalsIgnoreCase(const AString &other) const { 3288accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar return compareIgnoreCase(other) == 0; 3298accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar} 3308accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar 33172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::tolower() { 33272961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 33372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 33472961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mSize; ++i) { 33572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[i] = ::tolower(mData[i]); 33672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 33772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 33872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 33972961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::startsWith(const char *prefix) const { 34072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return !strncmp(mData, prefix, strlen(prefix)); 34172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 34272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 343ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberbool AString::endsWith(const char *suffix) const { 344ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber size_t suffixLen = strlen(suffix); 345ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 346ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mSize < suffixLen) { 347ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return false; 348ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 349ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 350ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return !strcmp(mData + mSize - suffixLen, suffix); 351ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 352ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3533c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnarbool AString::startsWithIgnoreCase(const char *prefix) const { 3543c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar return !strncasecmp(mData, prefix, strlen(prefix)); 3553c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar} 3563c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3573c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnarbool AString::endsWithIgnoreCase(const char *suffix) const { 3583c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar size_t suffixLen = strlen(suffix); 3593c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3603c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar if (mSize < suffixLen) { 3613c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar return false; 3623c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar } 3633c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3643c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar return !strcasecmp(mData + mSize - suffixLen, suffix); 3653c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar} 3663c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3678accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar// static 3688accee4f0e94f19866d260be6eecd6c219eb4982Lajos MolnarAString AString::FromParcel(const Parcel &parcel) { 3698accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar size_t size = static_cast<size_t>(parcel.readInt32()); 3708accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar return AString(static_cast<const char *>(parcel.readInplace(size)), size); 3718accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar} 3728accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar 3738accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnarstatus_t AString::writeToParcel(Parcel *parcel) const { 37455971df8768a2e613717a14251d56993b9322b5eSasha Levitskiy CHECK_LE(mSize, static_cast<size_t>(INT32_MAX)); 3758accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar status_t err = parcel->writeInt32(mSize); 3768accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar if (err == OK) { 3778accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar err = parcel->write(mData, mSize); 3788accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar } 3798accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar return err; 3808accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar} 3818accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar 382a1e8944a21e5833b7aadc451776f11797f5f9273Elliott HughesAString AStringPrintf(const char *format, ...) { 38372961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_list ap; 38472961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_start(ap, format); 38572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 38672961230a5890071bcca436eb5630172ce84ec41Andreas Huber char *buffer; 38772961230a5890071bcca436eb5630172ce84ec41Andreas Huber vasprintf(&buffer, format, ap); 38872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 38972961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_end(ap); 39072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 39172961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString result(buffer); 39272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 39372961230a5890071bcca436eb5630172ce84ec41Andreas Huber free(buffer); 39472961230a5890071bcca436eb5630172ce84ec41Andreas Huber buffer = NULL; 39572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 39672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return result; 39772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 39872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 39972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 40072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 401