AString.cpp revision 3c1da7224155516a08d94598eb64b64204bf10f8
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 23bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar#include <utils/String8.h> 2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h" 2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h" 2672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2772961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 2872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber// static 3072961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst char *AString::kEmptyString = ""; 3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3272961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString() 3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData((char *)kEmptyString), 3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3872961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const char *s) 3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s); 4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4572961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const char *s, size_t size) 4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s, size); 5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 52bcf08569453dcb42730cda3230d5d375a697005bLajos MolnarAString::AString(const String8 &from) 53bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar : mData(NULL), 54bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar mSize(0), 55bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar mAllocSize(1) { 56bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar setTo(from.string(), from.length()); 57bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar} 58bcf08569453dcb42730cda3230d5d375a697005bLajos Molnar 5972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const AString &from) 6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, 0, from.size()); 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6672961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const AString &from, size_t offset, size_t n) 6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, offset, n); 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7372961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::~AString() { 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7772961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString &AString::operator=(const AString &from) { 7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (&from != this) { 7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, 0, from.size()); 8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return *this; 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8572961230a5890071bcca436eb5630172ce84ec41Andreas Hubersize_t AString::size() const { 8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize; 8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8972961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst char *AString::c_str() const { 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mData; 9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::empty() const { 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize == 0; 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const char *s) { 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s, strlen(s)); 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const char *s, size_t size) { 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s, size); 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const AString &from, size_t offset, size_t n) { 10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(&from != this); 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from.mData + offset, n); 11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::clear() { 11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mData && mData != kEmptyString) { 11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber free(mData); 11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = NULL; 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)kEmptyString; 12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize = 0; 12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = 1; 12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12472961230a5890071bcca436eb5630172ce84ec41Andreas Hubersize_t AString::hash() const { 12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t x = 0; 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mSize; ++i) { 12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber x = (x * 31) + mData[i]; 12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return x; 13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13372961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator==(const AString &other) const { 13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize == other.mSize && !memcmp(mData, other.mData, mSize); 13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::trim() { 13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t i = 0; 14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (i < mSize && isspace(mData[i])) { 14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber ++i; 14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14572961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t j = mSize; 14672961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (j > i && isspace(mData[j - 1])) { 14772961230a5890071bcca436eb5630172ce84ec41Andreas Huber --j; 14872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 14972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(mData, &mData[i], j - i); 15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize = j - i; 15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::erase(size_t start, size_t n) { 15672961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LT(start, mSize); 15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(start + n, mSize); 15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(&mData[start], &mData[start + n], mSize - start - n); 16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize -= n; 16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 16472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::makeMutable() { 16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mData == kEmptyString) { 16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = strdup(kEmptyString); 16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const char *s) { 17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s, strlen(s)); 17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const char *s, size_t size) { 17772961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 17872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mSize + size + 1 > mAllocSize) { 18072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = (mAllocSize + size + 31) & -32; 18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)realloc(mData, mAllocSize); 18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mData != NULL); 18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber memcpy(&mData[mSize], s, size); 18672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize += size; 18772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 18872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const AString &from) { 19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(from.c_str(), from.size()); 19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 19372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const AString &from, size_t offset, size_t n) { 19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(from.c_str() + offset, n); 19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 19772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(int x) { 19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 200ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%d", x); 201ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned x) { 20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 207ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%u", x); 208ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(long x) { 213ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland char s[32]; 214ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%ld", x); 215ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 21672961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 21772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned long x) { 220ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland char s[32]; 221ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%lu", x); 222ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 22372961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 22472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(long long x) { 22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[32]; 228ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%lld", 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 long x) { 23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[32]; 235ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%llu", x); 236ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 23772961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 23872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(float x) { 24172961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 242ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%f", x); 243ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 24472961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 24572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 24672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(double x) { 24872961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 249ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%f", x); 250ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 25172961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 25272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 25372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 25472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(void *x) { 255ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland char s[32]; 256ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland int result = snprintf(s, sizeof(s), "%p", x); 257ef80764db37aa00bbb88755cb6cf11c6f2720bd3Marcus Oakland CHECK((result > 0) && ((size_t) result) < sizeof(s)); 25872961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 25972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26172961230a5890071bcca436eb5630172ce84ec41Andreas Huberssize_t AString::find(const char *substring, size_t start) const { 26272961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(start, size()); 26372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26472961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *match = strstr(mData + start, substring); 26572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26672961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (match == NULL) { 26772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return -1; 26872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 26972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return match - mData; 27172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 27272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::insert(const AString &from, size_t insertionPos) { 27472961230a5890071bcca436eb5630172ce84ec41Andreas Huber insert(from.c_str(), from.size(), insertionPos); 27572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::insert(const char *from, size_t size, size_t insertionPos) { 27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_GE(insertionPos, 0u); 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(insertionPos, mSize); 28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mSize + size + 1 > mAllocSize) { 28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = (mAllocSize + size + 31) & -32; 28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)realloc(mData, mAllocSize); 28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mData != NULL); 28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(&mData[insertionPos + size], 29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber &mData[insertionPos], mSize - insertionPos + 1); 29172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber memcpy(&mData[insertionPos], from, size); 29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize += size; 29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator<(const AString &other) const { 29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return compare(other) < 0; 29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30172961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator>(const AString &other) const { 30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return compare(other) > 0; 30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30572961230a5890071bcca436eb5630172ce84ec41Andreas Huberint AString::compare(const AString &other) const { 30672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return strcmp(mData, other.mData); 30772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::tolower() { 31072961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 31172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 31272961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mSize; ++i) { 31372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[i] = ::tolower(mData[i]); 31472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 31572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 31672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 31772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::startsWith(const char *prefix) const { 31872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return !strncmp(mData, prefix, strlen(prefix)); 31972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 32072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 321ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberbool AString::endsWith(const char *suffix) const { 322ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber size_t suffixLen = strlen(suffix); 323ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 324ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mSize < suffixLen) { 325ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return false; 326ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 327ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 328ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return !strcmp(mData + mSize - suffixLen, suffix); 329ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 330ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3313c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnarbool AString::startsWithIgnoreCase(const char *prefix) const { 3323c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar return !strncasecmp(mData, prefix, strlen(prefix)); 3333c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar} 3343c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3353c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnarbool AString::endsWithIgnoreCase(const char *suffix) const { 3363c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar size_t suffixLen = strlen(suffix); 3373c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3383c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar if (mSize < suffixLen) { 3393c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar return false; 3403c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar } 3413c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 3423c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar return !strcasecmp(mData + mSize - suffixLen, suffix); 3433c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar} 3443c1da7224155516a08d94598eb64b64204bf10f8Lajos Molnar 34572961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString StringPrintf(const char *format, ...) { 34672961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_list ap; 34772961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_start(ap, format); 34872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 34972961230a5890071bcca436eb5630172ce84ec41Andreas Huber char *buffer; 35072961230a5890071bcca436eb5630172ce84ec41Andreas Huber vasprintf(&buffer, format, ap); 35172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 35272961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_end(ap); 35372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 35472961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString result(buffer); 35572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 35672961230a5890071bcca436eb5630172ce84ec41Andreas Huber free(buffer); 35772961230a5890071bcca436eb5630172ce84ec41Andreas Huber buffer = NULL; 35872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 35972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return result; 36072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 36172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 36272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 36372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 364