11f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian/* 21f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * Copyright (C) 2009 The Android Open Source Project 31f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * 41f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 51f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * you may not use this file except in compliance with the License. 61f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * You may obtain a copy of the License at 71f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * 81f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 91f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * 101f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * Unless required by applicable law or agreed to in writing, software 111f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 121f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * See the License for the specific language governing permissions and 141f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian * limitations under the License. 151f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian */ 161f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 171f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 181f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// Sortable array of strings. STL-ish, but STL-free. 19c52fb038dc91712fc5159226006e03ce59b21b9aGlenn Kasten// 201f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 211f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian#include <stdlib.h> 221f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian#include <string.h> 231f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 241f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian#include "StringArray.h" 251f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 261f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopiannamespace android { 271f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 281f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 291f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// An expanding array of strings. Add, get, sort, delete. 301f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 311f7d356fa094b975ad2ebf9217be6abba2c70825Mathias AgopianStringArray::StringArray() 321f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian : mMax(0), mCurrent(0), mArray(NULL) 331f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian{ 341f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian} 351f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 361f7d356fa094b975ad2ebf9217be6abba2c70825Mathias AgopianStringArray:: ~StringArray() { 371f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian for (int i = 0; i < mCurrent; i++) 381f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian delete[] mArray[i]; 391f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian delete[] mArray; 401f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian} 411f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 421f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 431f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// Add a string. A copy of the string is made. 441f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 451f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopianbool StringArray::push_back(const char* str) { 461f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian if (mCurrent >= mMax) { 471f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian char** tmp; 481f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 491f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian if (mMax == 0) 501f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian mMax = 16; // initial storage 511f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian else 521f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian mMax *= 2; 531f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 541f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian tmp = new char*[mMax]; 551f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian if (tmp == NULL) 561f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian return false; 571f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 581f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian memcpy(tmp, mArray, mCurrent * sizeof(char*)); 591f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian delete[] mArray; 601f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian mArray = tmp; 611f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian } 621f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 631f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian int len = strlen(str); 641f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian mArray[mCurrent] = new char[len+1]; 651f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian memcpy(mArray[mCurrent], str, len+1); 661f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian mCurrent++; 671f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 681f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian return true; 691f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian} 701f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 711f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 721f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// Delete an entry. 731f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 741f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopianvoid StringArray::erase(int idx) { 751f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian if (idx < 0 || idx >= mCurrent) 761f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian return; 771f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian delete[] mArray[idx]; 781f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian if (idx < mCurrent-1) { 791f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian memmove(&mArray[idx], &mArray[idx+1], 801f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian (mCurrent-1 - idx) * sizeof(char*)); 811f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian } 821f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian mCurrent--; 831f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian} 841f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 851f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 861f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// Sort the array. 871f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 881f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopianvoid StringArray::sort(int (*compare)(const void*, const void*)) { 891f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian qsort(mArray, mCurrent, sizeof(char*), compare); 901f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian} 911f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 921f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 931f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// Pass this to the sort routine to do an ascending alphabetical sort. 941f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 951f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopianint StringArray::cmpAscendingAlpha(const void* pstr1, const void* pstr2) { 961f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian return strcmp(*(const char**)pstr1, *(const char**)pstr2); 971f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian} 981f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 991f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 1001f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// Set entry N to specified string. 1011f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// [should use operator[] here] 1021f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian// 1031f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopianvoid StringArray::setEntry(int idx, const char* str) { 1041f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian if (idx < 0 || idx >= mCurrent) 1051f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian return; 1061f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian delete[] mArray[idx]; 1071f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian int len = strlen(str); 1081f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian mArray[idx] = new char[len+1]; 1091f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian memcpy(mArray[idx], str, len+1); 1101f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian} 1111f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 1121f7d356fa094b975ad2ebf9217be6abba2c70825Mathias Agopian 11340bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 114