csutil/stringarray.h
Go to the documentation of this file.00001 /* 00002 Crystal Space String Array 00003 Copyright (C) 2003 by Jorrit Tyberghein 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public 00016 License along with this library; if not, write to the Free 00017 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 */ 00019 00020 #ifndef __CS_STRINGARRAY_H__ 00021 #define __CS_STRINGARRAY_H__ 00022 00027 #include <stdarg.h> 00028 #include "csextern.h" 00029 #include "csutil/array.h" 00030 #include "csutil/util.h" 00031 #include "csutil/csstring.h" 00032 00033 class csStringArrayElementHandler : public csArrayElementHandler<const char*> 00034 { 00035 public: 00036 static void Construct (const char** address, const char* const& src) 00037 { 00038 *address = csStrNew (src); 00039 } 00040 00041 static void Destroy (const char** address) 00042 { 00043 delete[] (char*)*address; 00044 } 00045 00046 static void InitRegion (const char** address, size_t count) 00047 { 00048 memset (address, 0, count*sizeof (const char*)); 00049 } 00050 }; 00051 00056 class csStringArray : public csArray<const char*, csStringArrayElementHandler> 00057 { 00058 private: 00059 typedef csArray<const char*, csStringArrayElementHandler> superclass; 00060 00061 public: 00066 csStringArray (size_t limit = 0, size_t threshold = 0) 00067 : superclass(limit, threshold) 00068 { 00069 } 00070 00072 static int CaseSensitiveCompare (const char* const &item1, 00073 const char* const &item2) 00074 { 00075 return strcmp (item1, item2); 00076 } 00077 00079 static int CaseInsensitiveCompare (const char* const &item1, 00080 const char* const &item2) 00081 { 00082 return csStrCaseCmp (item1, item2); 00083 } 00084 00088 void Sort (int(*compare)(char const* const&, char const* const&)) 00089 { 00090 superclass::Sort (compare); 00091 } 00092 00098 void Sort (bool case_sensitive = true) 00099 { 00100 if (case_sensitive) 00101 Sort (CaseSensitiveCompare); 00102 else 00103 Sort (CaseInsensitiveCompare); 00104 } 00105 00111 size_t FindSortedKey (csArrayCmp<char const*, char const*> comparekey, 00112 size_t* candidate = 0) const 00113 { 00114 return superclass::FindSortedKey(comparekey, candidate); 00115 } 00116 00122 size_t FindSortedKey (char const* key, bool case_sensitive = true, 00123 size_t* candidate = 0) const 00124 { 00125 int(*cf)(char const* const&, char const* const&) = 00126 case_sensitive ? CaseSensitiveCompare : CaseInsensitiveCompare; 00127 return FindSortedKey(csArrayCmp<char const*, char const*>(key, cf), 00128 candidate); 00129 } 00130 00135 size_t InsertSorted (const char* item, bool case_sensitive = true, 00136 size_t* equal_index = 0) 00137 { 00138 int(*cf)(char const* const&, char const* const&) = 00139 case_sensitive ? CaseSensitiveCompare : CaseInsensitiveCompare; 00140 return superclass::InsertSorted (item, cf, equal_index); 00141 } 00142 00148 char* Pop () 00149 { 00150 CS_ASSERT (GetSize () > 0); 00151 size_t l = GetSize () - 1; 00152 char* ret = (char*)Get (l); 00153 InitRegion (l, 1); 00154 SetSize (l); 00155 return ret; 00156 } 00157 00164 size_t Find (const char* str) const 00165 { 00166 for (size_t i = 0; i < GetSize (); i++) 00167 if (! strcmp (Get (i), str)) 00168 return i; 00169 return (size_t)-1; 00170 } 00171 00178 size_t FindCaseInsensitive (const char* str) const 00179 { 00180 for (size_t i = 0; i < GetSize (); i++) 00181 if (!csStrCaseCmp (Get (i), str)) 00182 return i; 00183 return (size_t)-1; 00184 } 00185 00197 size_t Contains(const char* str, bool case_sensitive = true) const 00198 { 00199 return case_sensitive ? Find(str) : FindCaseInsensitive(str); 00200 } 00201 00205 enum ConsecutiveDelimiterMode 00206 { 00208 delimSplitEach, 00214 delimIgnore, 00218 delimIgnoreDifferent 00219 }; 00224 size_t SplitString (const char* str, const char* delimiters, 00225 ConsecutiveDelimiterMode delimMode = delimSplitEach) 00226 { 00227 size_t num = 0; 00228 csString currentString; 00229 int lastDelim = -1; 00230 00231 const char* p = str; 00232 while (*p != 0) 00233 { 00234 if (strchr (delimiters, *p)) 00235 { 00236 bool newString = true; 00237 switch (delimMode) 00238 { 00239 case delimSplitEach: 00240 break; 00241 case delimIgnore: 00242 newString = lastDelim == -1; 00243 break; 00244 case delimIgnoreDifferent: 00245 newString = (lastDelim == -1) || (lastDelim == *p); 00246 break; 00247 } 00248 if (newString) 00249 { 00250 Push (currentString); 00251 currentString.Empty(); 00252 num++; 00253 lastDelim = *p; 00254 } 00255 } 00256 else 00257 { 00258 currentString.Append (*p); 00259 lastDelim = -1; 00260 } 00261 p++; 00262 } 00263 00264 Push (currentString); 00265 return num + 1; 00266 } 00267 }; 00268 00269 #endif // __CS_STRINGARRAY_H__
Generated for Crystal Space by doxygen 1.4.7