Home | History | Annotate | Download | only in libmedia
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 //
     18 // Sortable array of strings.  STL-ish, but STL-free.
     19 //
     20 
     21 #include <stdlib.h>
     22 #include <string.h>
     23 
     24 #include "StringArray.h"
     25 
     26 namespace android {
     27 
     28 //
     29 // An expanding array of strings.  Add, get, sort, delete.
     30 //
     31 StringArray::StringArray()
     32     : mMax(0), mCurrent(0), mArray(NULL)
     33 {
     34 }
     35 
     36 StringArray:: ~StringArray() {
     37     for (int i = 0; i < mCurrent; i++)
     38         delete[] mArray[i];
     39     delete[] mArray;
     40 }
     41 
     42 //
     43 // Add a string.  A copy of the string is made.
     44 //
     45 bool StringArray::push_back(const char* str) {
     46     if (mCurrent >= mMax) {
     47         char** tmp;
     48 
     49         if (mMax == 0)
     50             mMax = 16;      // initial storage
     51         else
     52             mMax *= 2;
     53 
     54         tmp = new char*[mMax];
     55         if (tmp == NULL)
     56             return false;
     57 
     58         memcpy(tmp, mArray, mCurrent * sizeof(char*));
     59         delete[] mArray;
     60         mArray = tmp;
     61     }
     62 
     63     int len = strlen(str);
     64     mArray[mCurrent] = new char[len+1];
     65     memcpy(mArray[mCurrent], str, len+1);
     66     mCurrent++;
     67 
     68     return true;
     69 }
     70 
     71 //
     72 // Delete an entry.
     73 //
     74 void StringArray::erase(int idx) {
     75     if (idx < 0 || idx >= mCurrent)
     76         return;
     77     delete[] mArray[idx];
     78     if (idx < mCurrent-1) {
     79         memmove(&mArray[idx], &mArray[idx+1],
     80                 (mCurrent-1 - idx) * sizeof(char*));
     81     }
     82     mCurrent--;
     83 }
     84 
     85 //
     86 // Sort the array.
     87 //
     88 void StringArray::sort(int (*compare)(const void*, const void*)) {
     89     qsort(mArray, mCurrent, sizeof(char*), compare);
     90 }
     91 
     92 //
     93 // Pass this to the sort routine to do an ascending alphabetical sort.
     94 //
     95 int StringArray::cmpAscendingAlpha(const void* pstr1, const void* pstr2) {
     96     return strcmp(*(const char**)pstr1, *(const char**)pstr2);
     97 }
     98 
     99 //
    100 // Set entry N to specified string.
    101 // [should use operator[] here]
    102 //
    103 void StringArray::setEntry(int idx, const char* str) {
    104     if (idx < 0 || idx >= mCurrent)
    105         return;
    106     delete[] mArray[idx];
    107     int len = strlen(str);
    108     mArray[idx] = new char[len+1];
    109     memcpy(mArray[idx], str, len+1);
    110 }
    111 
    112 
    113 } // namespace android
    114