00001 /********************************************************************** 00002 * $Id: cpl_path_cpp-source.html,v 1.5 2000/11/06 04:49:01 warmerda Exp $ 00003 * 00004 * Project: CPL - Common Portability Library 00005 * Purpose: Portable filename/path parsing, and forming ala "Glob API". 00006 * Author: Frank Warmerdam, warmerda@home.com 00007 * 00008 ********************************************************************** 00009 * Copyright (c) 1999, Frank Warmerdam 00010 * 00011 * Permission is hereby granted, free of charge, to any person obtaining a 00012 * copy of this software and associated documentation files (the "Software"), 00013 * to deal in the Software without restriction, including without limitation 00014 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00015 * and/or sell copies of the Software, and to permit persons to whom the 00016 * Software is furnished to do so, subject to the following conditions: 00017 * 00018 * The above copyright notice and this permission notice shall be included 00019 * in all copies or substantial portions of the Software. 00020 * 00021 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00022 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00023 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00024 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00025 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00026 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00027 * DEALINGS IN THE SOFTWARE. 00028 ********************************************************************** 00029 * 00030 * $Log: cpl_path_cpp-source.html,v $ 00030 * Revision 1.5 2000/11/06 04:49:01 warmerda 00030 * *** empty log message *** 00030 * 00031 * Revision 1.3 2000/01/26 17:53:36 warmerda 00032 * Fixed CPLGetExtension() for filenames with no extension. 00033 * 00034 * Revision 1.2 2000/01/24 19:32:59 warmerda 00035 * Fixed CPLGetExtension() to not include the dot. 00036 * 00037 * Revision 1.1 1999/10/14 19:23:39 warmerda 00038 * New 00039 * 00040 **********************************************************************/ 00041 00042 #include "cpl_conv.h" 00043 #include "cpl_string.h" 00044 00045 00046 static char szStaticResult[1024]; /* should be size of larged possible 00047 filename */ 00048 00049 /************************************************************************/ 00050 /* CPLFindFilenameStart() */ 00051 /************************************************************************/ 00052 00053 static int CPLFindFilenameStart( const char * pszFilename ) 00054 00055 { 00056 int iFileStart; 00057 00058 for( iFileStart = strlen(pszFilename); 00059 iFileStart > 0 00060 && pszFilename[iFileStart-1] != '/' 00061 && pszFilename[iFileStart-1] != '\\'; 00062 iFileStart-- ) {} 00063 00064 return iFileStart; 00065 } 00066 00067 /************************************************************************/ 00068 /* CPLGetPath() */ 00069 /************************************************************************/ 00070 00092 const char *CPLGetPath( const char *pszFilename ) 00093 00094 { 00095 int iFileStart = CPLFindFilenameStart(pszFilename); 00096 00097 if( iFileStart == 0 ) 00098 { 00099 strcpy( szStaticResult, "" ); 00100 return szStaticResult; 00101 } 00102 00103 strncpy( szStaticResult, pszFilename, iFileStart ); 00104 szStaticResult[iFileStart] = '\0'; 00105 00106 if( iFileStart > 1 00107 && (szStaticResult[iFileStart-1] == '/' 00108 || szStaticResult[iFileStart-1] == '\\') ) 00109 szStaticResult[iFileStart-1] = '\0'; 00110 00111 return szStaticResult; 00112 } 00113 00114 /************************************************************************/ 00115 /* CPLGetFilename() */ 00116 /************************************************************************/ 00117 00138 const char *CPLGetFilename( const char *pszFullFilename ) 00139 00140 { 00141 int iFileStart = CPLFindFilenameStart( pszFullFilename ); 00142 00143 strcpy( szStaticResult, pszFullFilename + iFileStart ); 00144 00145 return szStaticResult; 00146 } 00147 00148 /************************************************************************/ 00149 /* CPLGetBasename() */ 00150 /************************************************************************/ 00151 00172 const char *CPLGetBasename( const char *pszFullFilename ) 00173 00174 { 00175 int iFileStart = CPLFindFilenameStart( pszFullFilename ); 00176 int iExtStart, nLength; 00177 00178 for( iExtStart = strlen(pszFullFilename); 00179 iExtStart > iFileStart && pszFullFilename[iExtStart] != '.'; 00180 iExtStart-- ) {} 00181 00182 if( iExtStart == iFileStart ) 00183 iExtStart = strlen(pszFullFilename); 00184 00185 nLength = iExtStart - iFileStart; 00186 00187 strncpy( szStaticResult, pszFullFilename + iFileStart, nLength ); 00188 szStaticResult[nLength] = '\0'; 00189 00190 return szStaticResult; 00191 } 00192 00193 00194 /************************************************************************/ 00195 /* CPLGetExtension() */ 00196 /************************************************************************/ 00197 00217 const char *CPLGetExtension( const char *pszFullFilename ) 00218 00219 { 00220 int iFileStart = CPLFindFilenameStart( pszFullFilename ); 00221 int iExtStart; 00222 00223 for( iExtStart = strlen(pszFullFilename); 00224 iExtStart > iFileStart && pszFullFilename[iExtStart] != '.'; 00225 iExtStart-- ) {} 00226 00227 if( iExtStart == iFileStart ) 00228 iExtStart = strlen(pszFullFilename)-1; 00229 00230 strcpy( szStaticResult, pszFullFilename+iExtStart+1 ); 00231 00232 return szStaticResult; 00233 } 00234 00235 /************************************************************************/ 00236 /* CPLFormFilename() */ 00237 /************************************************************************/ 00238 00267 const char *CPLFormFilename( const char * pszPath, 00268 const char * pszBasename, 00269 const char * pszExtension ) 00270 00271 { 00272 const char *pszAddedPathSep = ""; 00273 const char *pszAddedExtSep = ""; 00274 00275 if( pszPath == NULL ) 00276 pszPath = ""; 00277 else if( strlen(pszPath) > 0 00278 && pszPath[strlen(pszPath)-1] != '/' 00279 && pszPath[strlen(pszPath)-1] != '\\' ) 00280 #ifdef WIN32 00281 pszAddedPathSep = "\\"; 00282 #else 00283 pszAddedPathSep = "/"; 00284 #endif 00285 00286 if( pszExtension == NULL ) 00287 pszExtension = ""; 00288 else if( pszExtension[0] != '.' && strlen(pszExtension) > 0 ) 00289 pszAddedExtSep = "."; 00290 00291 sprintf( szStaticResult, "%s%s%s%s%s", 00292 pszPath, pszAddedPathSep, 00293 pszBasename, 00294 pszAddedExtSep, pszExtension ); 00295 00296 return szStaticResult; 00297 }