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