1861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian/* 2861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * Copyright (C) 2009 The Android Open Source Project 3861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * 4861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * you may not use this file except in compliance with the License. 6861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * You may obtain a copy of the License at 7861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * 8861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * 10861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * Unless required by applicable law or agreed to in writing, software 11861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * See the License for the specific language governing permissions and 14861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian * limitations under the License. 15861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian */ 16861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 17861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 18861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// Sortable array of strings. STL-ish, but STL-free. 19861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 20861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 21861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian#include <stdlib.h> 22861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian#include <string.h> 23861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 24861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian#include <utils/StringArray.h> 25861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 26861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopiannamespace android { 27861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 28861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 29861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// An expanding array of strings. Add, get, sort, delete. 30861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 31861aa2f0c9136298380496bd78d6a18e69331c53Mathias AgopianStringArray::StringArray() 32861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian : mMax(0), mCurrent(0), mArray(NULL) 33861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian{ 34861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian} 35861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 36861aa2f0c9136298380496bd78d6a18e69331c53Mathias AgopianStringArray:: ~StringArray() { 37861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian for (int i = 0; i < mCurrent; i++) 38861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian delete[] mArray[i]; 39861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian delete[] mArray; 40861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian} 41861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 42861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 43861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// Add a string. A copy of the string is made. 44861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 45861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopianbool StringArray::push_back(const char* str) { 46861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian if (mCurrent >= mMax) { 47861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian char** tmp; 48861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 49861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian if (mMax == 0) 50861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian mMax = 16; // initial storage 51861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian else 52861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian mMax *= 2; 53861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 54861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian tmp = new char*[mMax]; 55861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian if (tmp == NULL) 56861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian return false; 57861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 58861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian memcpy(tmp, mArray, mCurrent * sizeof(char*)); 59861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian delete[] mArray; 60861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian mArray = tmp; 61861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian } 62861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 63861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian int len = strlen(str); 64861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian mArray[mCurrent] = new char[len+1]; 65861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian memcpy(mArray[mCurrent], str, len+1); 66861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian mCurrent++; 67861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 68861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian return true; 69861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian} 70861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 71861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 72861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// Delete an entry. 73861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 74861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopianvoid StringArray::erase(int idx) { 75861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian if (idx < 0 || idx >= mCurrent) 76861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian return; 77861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian delete[] mArray[idx]; 78861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian if (idx < mCurrent-1) { 79861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian memmove(&mArray[idx], &mArray[idx+1], 80861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian (mCurrent-1 - idx) * sizeof(char*)); 81861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian } 82861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian mCurrent--; 83861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian} 84861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 85861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 86861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// Sort the array. 87861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 88861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopianvoid StringArray::sort(int (*compare)(const void*, const void*)) { 89861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian qsort(mArray, mCurrent, sizeof(char*), compare); 90861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian} 91861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 92861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 93861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// Pass this to the sort routine to do an ascending alphabetical sort. 94861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 95861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopianint StringArray::cmpAscendingAlpha(const void* pstr1, const void* pstr2) { 96861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian return strcmp(*(const char**)pstr1, *(const char**)pstr2); 97861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian} 98861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 99861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 100861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// Set entry N to specified string. 101861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// [should use operator[] here] 102861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian// 103861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopianvoid StringArray::setEntry(int idx, const char* str) { 104861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian if (idx < 0 || idx >= mCurrent) 105861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian return; 106861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian delete[] mArray[idx]; 107861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian int len = strlen(str); 108861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian mArray[idx] = new char[len+1]; 109861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian memcpy(mArray[idx], str, len+1); 110861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian} 111861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 112861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian 113861aa2f0c9136298380496bd78d6a18e69331c53Mathias Agopian}; // namespace android 114