00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef _CPL_STRING_H_INCLUDED
00033 #define _CPL_STRING_H_INCLUDED
00034
00035 #include "cpl_vsi.h"
00036 #include "cpl_error.h"
00037 #include "cpl_conv.h"
00038
00061 CPL_C_START
00062
00063 char CPL_DLL **CSLAddString(char **papszStrList, const char *pszNewString) CPL_WARN_UNUSED_RESULT;
00064 int CPL_DLL CSLCount(char **papszStrList);
00065 const char CPL_DLL *CSLGetField( char **, int );
00066 void CPL_DLL CPL_STDCALL CSLDestroy(char **papszStrList);
00067 char CPL_DLL **CSLDuplicate(char **papszStrList) CPL_WARN_UNUSED_RESULT;
00068 char CPL_DLL **CSLMerge( char **papszOrig, char **papszOverride ) CPL_WARN_UNUSED_RESULT;
00069
00070 char CPL_DLL **CSLTokenizeString(const char *pszString ) CPL_WARN_UNUSED_RESULT;
00071 char CPL_DLL **CSLTokenizeStringComplex(const char *pszString,
00072 const char *pszDelimiter,
00073 int bHonourStrings, int bAllowEmptyTokens ) CPL_WARN_UNUSED_RESULT;
00074 char CPL_DLL **CSLTokenizeString2( const char *pszString,
00075 const char *pszDelimeter,
00076 int nCSLTFlags ) CPL_WARN_UNUSED_RESULT;
00077
00078 #define CSLT_HONOURSTRINGS 0x0001
00079 #define CSLT_ALLOWEMPTYTOKENS 0x0002
00080 #define CSLT_PRESERVEQUOTES 0x0004
00081 #define CSLT_PRESERVEESCAPES 0x0008
00082 #define CSLT_STRIPLEADSPACES 0x0010
00083 #define CSLT_STRIPENDSPACES 0x0020
00084
00085 int CPL_DLL CSLPrint(char **papszStrList, FILE *fpOut);
00086 char CPL_DLL **CSLLoad(const char *pszFname) CPL_WARN_UNUSED_RESULT;
00087 char CPL_DLL **CSLLoad2(const char *pszFname, int nMaxLines, int nMaxCols, char** papszOptions) CPL_WARN_UNUSED_RESULT;
00088 int CPL_DLL CSLSave(char **papszStrList, const char *pszFname);
00089
00090 char CPL_DLL **CSLInsertStrings(char **papszStrList, int nInsertAtLineNo,
00091 char **papszNewLines) CPL_WARN_UNUSED_RESULT;
00092 char CPL_DLL **CSLInsertString(char **papszStrList, int nInsertAtLineNo,
00093 const char *pszNewLine) CPL_WARN_UNUSED_RESULT;
00094 char CPL_DLL **CSLRemoveStrings(char **papszStrList, int nFirstLineToDelete,
00095 int nNumToRemove, char ***ppapszRetStrings) CPL_WARN_UNUSED_RESULT;
00096 int CPL_DLL CSLFindString( char **, const char * );
00097 int CPL_DLL CSLFindStringCaseSensitive( char **, const char * );
00098 int CPL_DLL CSLPartialFindString( char **papszHaystack,
00099 const char * pszNeedle );
00100 int CPL_DLL CSLFindName(char **papszStrList, const char *pszName);
00101 int CPL_DLL CSLTestBoolean( const char *pszValue );
00102 int CPL_DLL CSLFetchBoolean( char **papszStrList, const char *pszKey,
00103 int bDefault );
00104
00105 const char CPL_DLL *
00106 CPLParseNameValue(const char *pszNameValue, char **ppszKey );
00107 const char CPL_DLL *
00108 CSLFetchNameValue(char **papszStrList, const char *pszName);
00109 const char CPL_DLL *
00110 CSLFetchNameValueDef(char **papszStrList, const char *pszName,
00111 const char *pszDefault );
00112 char CPL_DLL **
00113 CSLFetchNameValueMultiple(char **papszStrList, const char *pszName);
00114 char CPL_DLL **
00115 CSLAddNameValue(char **papszStrList,
00116 const char *pszName, const char *pszValue) CPL_WARN_UNUSED_RESULT;
00117 char CPL_DLL **
00118 CSLSetNameValue(char **papszStrList,
00119 const char *pszName, const char *pszValue) CPL_WARN_UNUSED_RESULT;
00120 void CPL_DLL CSLSetNameValueSeparator( char ** papszStrList,
00121 const char *pszSeparator );
00122
00123 #define CPLES_BackslashQuotable 0
00124 #define CPLES_XML 1
00125 #define CPLES_URL 2
00126 #define CPLES_SQL 3
00127 #define CPLES_CSV 4
00128 #define CPLES_XML_BUT_QUOTES 5
00129
00130 char CPL_DLL *CPLEscapeString( const char *pszString, int nLength,
00131 int nScheme ) CPL_WARN_UNUSED_RESULT;
00132 char CPL_DLL *CPLUnescapeString( const char *pszString, int *pnLength,
00133 int nScheme ) CPL_WARN_UNUSED_RESULT;
00134
00135 char CPL_DLL *CPLBinaryToHex( int nBytes, const GByte *pabyData ) CPL_WARN_UNUSED_RESULT;
00136 GByte CPL_DLL *CPLHexToBinary( const char *pszHex, int *pnBytes ) CPL_WARN_UNUSED_RESULT;
00137
00138 char CPL_DLL *CPLBase64Encode( int nBytes, const GByte *pabyData ) CPL_WARN_UNUSED_RESULT;
00139 int CPL_DLL CPLBase64DecodeInPlace(GByte* pszBase64);
00140
00141 typedef enum
00142 {
00143 CPL_VALUE_STRING,
00144 CPL_VALUE_REAL,
00145 CPL_VALUE_INTEGER
00146 } CPLValueType;
00147
00148 CPLValueType CPL_DLL CPLGetValueType(const char* pszValue);
00149
00150 size_t CPL_DLL CPLStrlcpy(char* pszDest, const char* pszSrc, size_t nDestSize);
00151 size_t CPL_DLL CPLStrlcat(char* pszDest, const char* pszSrc, size_t nDestSize);
00152 size_t CPL_DLL CPLStrnlen (const char *pszStr, size_t nMaxLen);
00153
00154
00155
00156
00157 int CPL_DLL CPLvsnprintf(char *str, size_t size, const char* fmt, va_list args);
00158 int CPL_DLL CPLsnprintf(char *str, size_t size, const char* fmt, ...) CPL_PRINT_FUNC_FORMAT(3,4);
00159 int CPL_DLL CPLsprintf(char *str, const char* fmt, ...) CPL_PRINT_FUNC_FORMAT(2, 3);
00160 int CPL_DLL CPLprintf(const char* fmt, ...) CPL_PRINT_FUNC_FORMAT(1, 2);
00161 int CPL_DLL CPLsscanf(const char* str, const char* fmt, ...);
00162
00163 const char CPL_DLL *CPLSPrintf(const char *fmt, ...) CPL_PRINT_FUNC_FORMAT(1, 2);
00164 char CPL_DLL **CSLAppendPrintf(char **papszStrList, const char *fmt, ...) CPL_PRINT_FUNC_FORMAT(2, 3) CPL_WARN_UNUSED_RESULT;
00165 int CPL_DLL CPLVASPrintf(char **buf, const char *fmt, va_list args );
00166
00167
00168
00169
00170 #define CPL_ENC_LOCALE ""
00171 #define CPL_ENC_UTF8 "UTF-8"
00172 #define CPL_ENC_UTF16 "UTF-16"
00173 #define CPL_ENC_UCS2 "UCS-2"
00174 #define CPL_ENC_UCS4 "UCS-4"
00175 #define CPL_ENC_ASCII "ASCII"
00176 #define CPL_ENC_ISO8859_1 "ISO-8859-1"
00177
00178 int CPL_DLL CPLEncodingCharSize( const char *pszEncoding );
00179 void CPL_DLL CPLClearRecodeWarningFlags( void );
00180 char CPL_DLL *CPLRecode( const char *pszSource,
00181 const char *pszSrcEncoding,
00182 const char *pszDstEncoding ) CPL_WARN_UNUSED_RESULT;
00183 char CPL_DLL *CPLRecodeFromWChar( const wchar_t *pwszSource,
00184 const char *pszSrcEncoding,
00185 const char *pszDstEncoding ) CPL_WARN_UNUSED_RESULT;
00186 wchar_t CPL_DLL *CPLRecodeToWChar( const char *pszSource,
00187 const char *pszSrcEncoding,
00188 const char *pszDstEncoding ) CPL_WARN_UNUSED_RESULT;
00189 int CPL_DLL CPLIsUTF8(const char* pabyData, int nLen);
00190 char CPL_DLL *CPLForceToASCII(const char* pabyData, int nLen, char chReplacementChar) CPL_WARN_UNUSED_RESULT;
00191 int CPL_DLL CPLStrlenUTF8(const char *pszUTF8Str);
00192
00193 CPL_C_END
00194
00195
00196
00197
00198
00199 #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
00200
00201 #include <string>
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 #if defined(_MSC_VER)
00217 # if (_MSC_VER <= 1202)
00218 # define MSVC_OLD_STUPID_BEHAVIOUR
00219 # endif
00220 #endif
00221
00222
00223 #ifdef MSVC_OLD_STUPID_BEHAVIOUR
00224 using std::string;
00225 # define gdal_std_string string
00226 #else
00227 # define gdal_std_string std::string
00228 #endif
00229
00230
00231 #if defined(WIN32CE)
00232 # pragma warning(disable:4251 4275 4786)
00233 #endif
00234
00236 class CPL_DLL CPLString : public gdal_std_string
00237 {
00238 public:
00239
00240
00241 CPLString(void) {}
00242 CPLString( const std::string &oStr ) : gdal_std_string( oStr ) {}
00243 CPLString( const char *pszStr ) : gdal_std_string( pszStr ) {}
00244
00245 operator const char* (void) const { return c_str(); }
00246
00247 char& operator[](std::string::size_type i)
00248 {
00249 return gdal_std_string::operator[](i);
00250 }
00251
00252 const char& operator[](std::string::size_type i) const
00253 {
00254 return gdal_std_string::operator[](i);
00255 }
00256
00257 char& operator[](int i)
00258 {
00259 return gdal_std_string::operator[](static_cast<std::string::size_type>(i));
00260 }
00261
00262 const char& operator[](int i) const
00263 {
00264 return gdal_std_string::operator[](static_cast<std::string::size_type>(i));
00265 }
00266
00267 void Clear() { resize(0); }
00268
00269
00270 void Seize(char *pszValue)
00271 {
00272 if (pszValue == NULL )
00273 Clear();
00274 else
00275 {
00276 *this = pszValue;
00277 CPLFree(pszValue);
00278 }
00279 }
00280
00281
00282 CPLString &Printf( const char *pszFormat, ... ) CPL_PRINT_FUNC_FORMAT (2, 3);
00283 CPLString &vPrintf( const char *pszFormat, va_list args );
00284 CPLString &FormatC( double dfValue, const char *pszFormat = NULL );
00285 CPLString &Trim();
00286 CPLString &Recode( const char *pszSrcEncoding, const char *pszDstEncoding );
00287
00288
00289 size_t ifind( const std::string & str, size_t pos = 0 ) const;
00290 size_t ifind( const char * s, size_t pos = 0 ) const;
00291 CPLString &toupper( void );
00292 CPLString &tolower( void );
00293 };
00294
00295 CPLString CPLOPrintf(const char *pszFormat, ... ) CPL_PRINT_FUNC_FORMAT (1, 2);
00296 CPLString CPLOvPrintf(const char *pszFormat, va_list args);
00297
00298
00299
00300
00301 CPLString CPL_DLL CPLURLGetValue(const char* pszURL, const char* pszKey);
00302 CPLString CPL_DLL CPLURLAddKVP(const char* pszURL, const char* pszKey,
00303 const char* pszValue);
00304
00305
00306
00307
00308
00310 class CPL_DLL CPLStringList
00311 {
00312 char **papszList;
00313 mutable int nCount;
00314 mutable int nAllocation;
00315 int bOwnList;
00316 int bIsSorted;
00317
00318 void Initialize();
00319 void MakeOurOwnCopy();
00320 void EnsureAllocation( int nMaxLength );
00321 int FindSortedInsertionPoint( const char *pszLine );
00322
00323 public:
00324 CPLStringList();
00325 CPLStringList( char **papszList, int bTakeOwnership=TRUE );
00326 CPLStringList( const CPLStringList& oOther );
00327 ~CPLStringList();
00328
00329 CPLStringList &Clear();
00330
00331 int size() const { return Count(); }
00332 int Count() const;
00333
00334 CPLStringList &AddString( const char *pszNewString );
00335 CPLStringList &AddStringDirectly( char *pszNewString );
00336
00337 CPLStringList &InsertString( int nInsertAtLineNo, const char *pszNewLine )
00338 { return InsertStringDirectly( nInsertAtLineNo, CPLStrdup(pszNewLine) ); }
00339 CPLStringList &InsertStringDirectly( int nInsertAtLineNo, char *pszNewLine);
00340
00341
00342
00343
00344 int FindString( const char *pszTarget ) const
00345 { return CSLFindString( papszList, pszTarget ); }
00346 int PartialFindString( const char *pszNeedle ) const
00347 { return CSLPartialFindString( papszList, pszNeedle ); }
00348
00349 int FindName( const char *pszName ) const;
00350 int FetchBoolean( const char *pszKey, int bDefault ) const;
00351 const char *FetchNameValue( const char *pszKey ) const;
00352 const char *FetchNameValueDef( const char *pszKey, const char *pszDefault ) const;
00353 CPLStringList &AddNameValue( const char *pszKey, const char *pszValue );
00354 CPLStringList &SetNameValue( const char *pszKey, const char *pszValue );
00355
00356 CPLStringList &Assign( char **papszListIn, int bTakeOwnership=TRUE );
00357 CPLStringList &operator=(char **papszListIn) { return Assign( papszListIn, TRUE ); }
00358 CPLStringList &operator=(const CPLStringList& oOther);
00359
00360 char * operator[](int i);
00361 char * operator[](size_t i) { return (*this)[(int)i]; }
00362 const char * operator[](int i) const;
00363 const char * operator[](size_t i) const { return (*this)[(int)i]; }
00364
00365 char **List() { return papszList; }
00366 char **StealList();
00367
00368 CPLStringList &Sort();
00369 int IsSorted() const { return bIsSorted; }
00370
00371 operator char**(void) { return List(); }
00372 };
00373
00374 #endif
00375
00376 #endif