AString.cpp revision 55971df8768a2e613717a14251d56993b9322b5e
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 1772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <ctype.h> 1872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <stdarg.h> 1972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <stdio.h> 2072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <stdlib.h> 2172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <string.h> 2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 238accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar#include <binder/Parcel.h> 24bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar#include <utils/String8.h> 2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h" 2672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h" 2772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2872961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber// static 3172961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst char *AString::kEmptyString = ""; 3272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3372961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString() 3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData((char *)kEmptyString), 3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const char *s) 4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s); 4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4672961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const char *s, size_t size) 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s, size); 5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 53bcf08569453dcb42730cda3230d5d375a697005bLajos MolnarAString::AString(const String8 &from) 54bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar : mData(NULL), 55bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar mSize(0), 56bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar mAllocSize(1) { 57bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar setTo(from.string(), from.length()); 58bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar} 59bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar 6072961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const AString &from) 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, 0, from.size()); 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6772961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const AString &from, size_t offset, size_t n) 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, offset, n); 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7472961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::~AString() { 7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7872961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString &AString::operator=(const AString &from) { 7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (&from != this) { 8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, 0, from.size()); 8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return *this; 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8672961230a5890071bcca436eb5630172ce84ec41Andreas Hubersize_t AString::size() const { 8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize; 8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst char *AString::c_str() const { 9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mData; 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::empty() const { 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize == 0; 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const char *s) { 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s, strlen(s)); 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const char *s, size_t size) { 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s, size); 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const AString &from, size_t offset, size_t n) { 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(&from != this); 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from.mData + offset, n); 11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::clear() { 11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mData && mData != kEmptyString) { 11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber free(mData); 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = NULL; 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)kEmptyString; 12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize = 0; 12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = 1; 12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12572961230a5890071bcca436eb5630172ce84ec41Andreas Hubersize_t AString::hash() const { 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t x = 0; 12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mSize; ++i) { 12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber x = (x * 31) + mData[i]; 12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return x; 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13472961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator==(const AString &other) const { 13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize == other.mSize && !memcmp(mData, other.mData, mSize); 13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::trim() { 13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t i = 0; 14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (i < mSize && isspace(mData[i])) { 14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber ++i; 14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 14572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14672961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t j = mSize; 14772961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (j > i && isspace(mData[j - 1])) { 14872961230a5890071bcca436eb5630172ce84ec41Andreas Huber --j; 14972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(mData, &mData[i], j - i); 15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize = j - i; 15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::erase(size_t start, size_t n) { 15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LT(start, mSize); 15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(start + n, mSize); 15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(&mData[start], &mData[start + n], mSize - start - n); 16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize -= n; 16472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::makeMutable() { 16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mData == kEmptyString) { 16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = strdup(kEmptyString); 17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const char *s) { 17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s, strlen(s)); 17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 17672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const char *s, size_t size) { 17872961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mSize + size + 1 > mAllocSize) { 18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = (mAllocSize + size + 31) & -32; 18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)realloc(mData, mAllocSize); 18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mData != NULL); 18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18672961230a5890071bcca436eb5630172ce84ec41Andreas Huber memcpy(&mData[mSize], s, size); 18772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize += size; 18872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 19072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const AString &from) { 19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(from.c_str(), from.size()); 19372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 19472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const AString &from, size_t offset, size_t n) { 19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(from.c_str() + offset, n); 19772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(int x) { 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 201ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%d", x); 202ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned x) { 20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 208ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%u", x); 209ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(long x) { 214ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland char s[32]; 215ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%ld", x); 216ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 21772961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 21872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned long x) { 221ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland char s[32]; 222ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%lu", x); 223ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 22472961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(long long x) { 22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[32]; 229ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%lld", x); 230ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned long long x) { 23572961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[32]; 236ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%llu", x); 237ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 23872961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 23972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 24072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(float x) { 24272961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 243ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%f", x); 244ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 24572961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 24672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 24772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(double x) { 24972961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 250ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%f", x); 251ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 25272961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 25372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 25472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 25572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(void *x) { 256ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland char s[32]; 257ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%p", x); 258ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 25972961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 26172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26272961230a5890071bcca436eb5630172ce84ec41Andreas Huberssize_t AString::find(const char *substring, size_t start) const { 26372961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(start, size()); 26472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26572961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *match = strstr(mData + start, substring); 26672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (match == NULL) { 26872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return -1; 26972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 27072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return match - mData; 27272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 27372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::insert(const AString &from, size_t insertionPos) { 27572961230a5890071bcca436eb5630172ce84ec41Andreas Huber insert(from.c_str(), from.size(), insertionPos); 27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::insert(const char *from, size_t size, size_t insertionPos) { 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_GE(insertionPos, 0u); 28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(insertionPos, mSize); 28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mSize + size + 1 > mAllocSize) { 28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = (mAllocSize + size + 31) & -32; 28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)realloc(mData, mAllocSize); 28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mData != NULL); 28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(&mData[insertionPos + size], 29172961230a5890071bcca436eb5630172ce84ec41Andreas Huber &mData[insertionPos], mSize - insertionPos + 1); 29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber memcpy(&mData[insertionPos], from, size); 29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize += size; 29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 29772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29872961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator<(const AString &other) const { 29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return compare(other) < 0; 30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30272961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator>(const AString &other) const { 30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return compare(other) > 0; 30472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30672961230a5890071bcca436eb5630172ce84ec41Andreas Huberint AString::compare(const AString &other) const { 30772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return strcmp(mData, other.mData); 30872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3108accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnarint AString::compareIgnoreCase(const AString &other) const { 3118accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar return strcasecmp(mData, other.mData); 3128accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar} 3138accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar 3148accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnarbool AString::equalsIgnoreCase(const AString &other) const { 3158accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar return compareIgnoreCase(other) == 0; 3168accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar} 3178accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar 31872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::tolower() { 31972961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 32072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 32172961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mSize; ++i) { 32272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[i] = ::tolower(mData[i]); 32372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 32472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 32572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 32672961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::startsWith(const char *prefix) const { 32772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return !strncmp(mData, prefix, strlen(prefix)); 32872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 32972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 330ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberbool AString::endsWith(const char *suffix) const { 331ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber size_t suffixLen = strlen(suffix); 332ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 333ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mSize < suffixLen) { 334ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return false; 335ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 336ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 337ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return !strcmp(mData + mSize - suffixLen, suffix); 338ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 339ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3403c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnarbool AString::startsWithIgnoreCase(const char *prefix) const { 3413c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar return !strncasecmp(mData, prefix, strlen(prefix)); 3423c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar} 3433c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3443c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnarbool AString::endsWithIgnoreCase(const char *suffix) const { 3453c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar size_t suffixLen = strlen(suffix); 3463c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3473c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar if (mSize < suffixLen) { 3483c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar return false; 3493c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar } 3503c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3513c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar return !strcasecmp(mData + mSize - suffixLen, suffix); 3523c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar} 3533c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3548accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar// static 3558accee4f0e94f19866d260be6eecd6c219eb4982Lajos MolnarAString AString::FromParcel(const Parcel &parcel) { 3568accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar size_t size = static_cast<size_t>(parcel.readInt32()); 3578accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar return AString(static_cast<const char *>(parcel.readInplace(size)), size); 3588accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar} 3598accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar 3608accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnarstatus_t AString::writeToParcel(Parcel *parcel) const { 36155971df8768a2e613717a14251d56993b9322b5eSasha Levitskiy CHECK_LE(mSize, static_cast<size_t>(INT32_MAX)); 3628accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar status_t err = parcel->writeInt32(mSize); 3638accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar if (err == OK) { 3648accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar err = parcel->write(mData, mSize); 3658accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar } 3668accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar return err; 3678accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar} 3688accee4f0e94f19866d260be6eecd6c219eb4982Lajos Molnar 36972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString StringPrintf(const char *format, ...) { 37072961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_list ap; 37172961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_start(ap, format); 37272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 37372961230a5890071bcca436eb5630172ce84ec41Andreas Huber char *buffer; 37472961230a5890071bcca436eb5630172ce84ec41Andreas Huber vasprintf(&buffer, format, ap); 37572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 37672961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_end(ap); 37772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 37872961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString result(buffer); 37972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 38072961230a5890071bcca436eb5630172ce84ec41Andreas Huber free(buffer); 38172961230a5890071bcca436eb5630172ce84ec41Andreas Huber buffer = NULL; 38272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 38372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return result; 38472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 38572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 38672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 38772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 388