AString.cpp revision 72961230a5890071bcca436eb5630172ce84ec41
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 2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h" 2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h" 2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2672961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 2772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2872961230a5890071bcca436eb5630172ce84ec41Andreas Huber// static 2972961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst char *AString::kEmptyString = ""; 3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3172961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString() 3272961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData((char *)kEmptyString), 3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3772961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const char *s) 3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s); 4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4472961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const char *s, size_t size) 4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s, size); 4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5172961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const AString &from) 5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, 0, from.size()); 5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5872961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::AString(const AString &from, size_t offset, size_t n) 5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mData(NULL), 6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize(0), 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize(1) { 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, offset, n); 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6572961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString::~AString() { 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString &AString::operator=(const AString &from) { 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (&from != this) { 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from, 0, from.size()); 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return *this; 7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7772961230a5890071bcca436eb5630172ce84ec41Andreas Hubersize_t AString::size() const { 7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize; 7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8172961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst char *AString::c_str() const { 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mData; 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::empty() const { 8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize == 0; 8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const char *s) { 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(s, strlen(s)); 9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const char *s, size_t size) { 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s, size); 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::setTo(const AString &from, size_t offset, size_t n) { 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(&from != this); 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber setTo(from.mData + offset, n); 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::clear() { 10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mData && mData != kEmptyString) { 10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber free(mData); 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = NULL; 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)kEmptyString; 11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize = 0; 11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = 1; 11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11672961230a5890071bcca436eb5630172ce84ec41Andreas Hubersize_t AString::hash() const { 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t x = 0; 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mSize; ++i) { 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber x = (x * 31) + mData[i]; 12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return x; 12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator==(const AString &other) const { 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mSize == other.mSize && !memcmp(mData, other.mData, mSize); 12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::trim() { 13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t i = 0; 13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (i < mSize && isspace(mData[i])) { 13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber ++i; 13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t j = mSize; 13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (j > i && isspace(mData[j - 1])) { 13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber --j; 14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(mData, &mData[i], j - i); 14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize = j - i; 14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 14572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 14672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::erase(size_t start, size_t n) { 14872961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LT(start, mSize); 14972961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(start + n, mSize); 15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(&mData[start], &mData[start + n], mSize - start - n); 15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize -= n; 15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 15672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::makeMutable() { 15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mData == kEmptyString) { 16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = strdup(kEmptyString); 16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const char *s) { 16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s, strlen(s)); 16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const char *s, size_t size) { 16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mSize + size + 1 > mAllocSize) { 17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = (mAllocSize + size + 31) & -32; 17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)realloc(mData, mAllocSize); 17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mData != NULL); 17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 17672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17772961230a5890071bcca436eb5630172ce84ec41Andreas Huber memcpy(&mData[mSize], s, size); 17872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize += size; 17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[mSize] = '\0'; 18072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const AString &from) { 18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(from.c_str(), from.size()); 18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(const AString &from, size_t offset, size_t n) { 18772961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(from.c_str() + offset, n); 18872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(int x) { 19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber sprintf(s, "%d", x); 19372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19472961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned x) { 19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber sprintf(s, "%u", x); 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(long x) { 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber sprintf(s, "%ld", x); 20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned long x) { 21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber sprintf(s, "%lu", x); 21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21572961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 21672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(long long x) { 21972961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[32]; 22072961230a5890071bcca436eb5630172ce84ec41Andreas Huber sprintf(s, "%lld", x); 22172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22272961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 22372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 22472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(unsigned long long x) { 22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[32]; 22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber sprintf(s, "%llu", x); 22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(float x) { 23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber sprintf(s, "%f", x); 23572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23672961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 23772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(double x) { 24072961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 24172961230a5890071bcca436eb5630172ce84ec41Andreas Huber sprintf(s, "%f", x); 24272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24372961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 24472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 24572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::append(void *x) { 24772961230a5890071bcca436eb5630172ce84ec41Andreas Huber char s[16]; 24872961230a5890071bcca436eb5630172ce84ec41Andreas Huber sprintf(s, "%p", x); 24972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 25072961230a5890071bcca436eb5630172ce84ec41Andreas Huber append(s); 25172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 25272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 25372961230a5890071bcca436eb5630172ce84ec41Andreas Huberssize_t AString::find(const char *substring, size_t start) const { 25472961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(start, size()); 25572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 25672961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *match = strstr(mData + start, substring); 25772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 25872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (match == NULL) { 25972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return -1; 26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 26172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return match - mData; 26372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 26472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::insert(const AString &from, size_t insertionPos) { 26672961230a5890071bcca436eb5630172ce84ec41Andreas Huber insert(from.c_str(), from.size(), insertionPos); 26772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 26872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::insert(const char *from, size_t size, size_t insertionPos) { 27072961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_GE(insertionPos, 0u); 27172961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK_LE(insertionPos, mSize); 27272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27372961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 27472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27572961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mSize + size + 1 > mAllocSize) { 27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mAllocSize = (mAllocSize + size + 31) & -32; 27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData = (char *)realloc(mData, mAllocSize); 27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mData != NULL); 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber memmove(&mData[insertionPos + size], 28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber &mData[insertionPos], mSize - insertionPos + 1); 28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber memcpy(&mData[insertionPos], from, size); 28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mSize += size; 28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28972961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator<(const AString &other) const { 29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return compare(other) < 0; 29172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29372961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::operator>(const AString &other) const { 29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return compare(other) > 0; 29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29772961230a5890071bcca436eb5630172ce84ec41Andreas Huberint AString::compare(const AString &other) const { 29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return strcmp(mData, other.mData); 29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AString::tolower() { 30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber makeMutable(); 30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30472961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mSize; ++i) { 30572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mData[i] = ::tolower(mData[i]); 30672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 30772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30972961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AString::startsWith(const char *prefix) const { 31072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return !strncmp(mData, prefix, strlen(prefix)); 31172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 31272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 31372961230a5890071bcca436eb5630172ce84ec41Andreas HuberAString StringPrintf(const char *format, ...) { 31472961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_list ap; 31572961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_start(ap, format); 31672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 31772961230a5890071bcca436eb5630172ce84ec41Andreas Huber char *buffer; 31872961230a5890071bcca436eb5630172ce84ec41Andreas Huber vasprintf(&buffer, format, ap); 31972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 32072961230a5890071bcca436eb5630172ce84ec41Andreas Huber va_end(ap); 32172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 32272961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString result(buffer); 32372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 32472961230a5890071bcca436eb5630172ce84ec41Andreas Huber free(buffer); 32572961230a5890071bcca436eb5630172ce84ec41Andreas Huber buffer = NULL; 32672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 32772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return result; 32872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 32972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 33072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 33172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 332