00001 /****************************************************************************** 00002 * $Id: cpl_findfile_cpp-source.html,v 1.8 2001/07/05 13:24:08 warmerda Exp $ 00003 * 00004 * Project: CPL - Common Portability Library 00005 * Purpose: Generic data file location finder, with application hooking. 00006 * Author: Frank Warmerdam, warmerda@home.com 00007 * 00008 ****************************************************************************** 00009 * Copyright (c) 2000, 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 00022 * OR 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_findfile_cpp-source.html,v $ 00030 * Revision 1.8 2001/07/05 13:24:08 warmerda 00030 * *** empty log message *** 00030 * 00031 * Revision 1.2 2001/01/19 21:16:41 warmerda 00032 * expanded tabs 00033 * 00034 * Revision 1.1 2000/08/29 21:06:25 warmerda 00035 * New 00036 * 00037 */ 00038 00039 #include "cpl_conv.h" 00040 #include "cpl_string.h" 00041 00042 static int bFinderInitialized = FALSE; 00043 static int nFileFinders = 0; 00044 static CPLFileFinder *papfnFinders = NULL; 00045 static char **papszFinderLocations = NULL; 00046 00047 /************************************************************************/ 00048 /* CPLFinderInit() */ 00049 /************************************************************************/ 00050 00051 static void CPLFinderInit() 00052 00053 { 00054 if( !bFinderInitialized ) 00055 { 00056 bFinderInitialized = TRUE; 00057 CPLPushFileFinder( CPLDefaultFindFile ); 00058 CPLPushFinderLocation( "/usr/local/share" ); 00059 CPLPushFinderLocation( "." ); 00060 } 00061 } 00062 00063 /************************************************************************/ 00064 /* CPLDefaultFileFind() */ 00065 /************************************************************************/ 00066 00067 const char *CPLDefaultFindFile( const char *pszClass, 00068 const char *pszBasename ) 00069 00070 { 00071 int i, nLocations = CSLCount( papszFinderLocations ); 00072 00073 (void) pszClass; 00074 00075 for( i = nLocations-1; nLocations >= 0; nLocations-- ) 00076 { 00077 const char *pszResult; 00078 VSIStatBuf sStat; 00079 00080 pszResult = CPLFormFilename( papszFinderLocations[i], pszBasename, 00081 NULL ); 00082 00083 if( VSIStat( pszResult, &sStat ) == 0 ) 00084 return pszResult; 00085 } 00086 00087 return NULL; 00088 } 00089 00090 /************************************************************************/ 00091 /* CPLFindFile() */ 00092 /************************************************************************/ 00093 00094 const char *CPLFindFile( const char *pszClass, const char *pszBasename ) 00095 00096 { 00097 int i; 00098 00099 CPLFinderInit(); 00100 00101 for( i = nFileFinders-1; i >= 0; i-- ) 00102 { 00103 const char * pszResult; 00104 00105 pszResult = (papfnFinders[i])( pszClass, pszBasename ); 00106 if( pszResult != NULL ) 00107 return pszResult; 00108 } 00109 00110 return NULL; 00111 } 00112 00113 /************************************************************************/ 00114 /* CPLPushFileFinder() */ 00115 /************************************************************************/ 00116 00117 void CPLPushFileFinder( CPLFileFinder pfnFinder ) 00118 00119 { 00120 CPLFinderInit(); 00121 00122 papfnFinders = (CPLFileFinder *) 00123 CPLRealloc(papfnFinders, sizeof(void*) * ++nFileFinders); 00124 papfnFinders[nFileFinders-1] = pfnFinder; 00125 } 00126 00127 /************************************************************************/ 00128 /* CPLPopFileFinder() */ 00129 /************************************************************************/ 00130 00131 CPLFileFinder CPLPopFileFinder() 00132 00133 { 00134 CPLFinderInit(); 00135 00136 if( nFileFinders == 0 ) 00137 return NULL; 00138 00139 return papfnFinders[--nFileFinders]; 00140 } 00141 00142 /************************************************************************/ 00143 /* CPLPushFinderLocation() */ 00144 /************************************************************************/ 00145 00146 void CPLPushFinderLocation( const char *pszLocation ) 00147 00148 { 00149 CPLFinderInit(); 00150 00151 papszFinderLocations = CSLAddString( papszFinderLocations, 00152 pszLocation ); 00153 } 00154 00155 00156 /************************************************************************/ 00157 /* CPLPushFinderLocation() */ 00158 /************************************************************************/ 00159 00160 void CPLPopFinderLocation() 00161 00162 { 00163 int nCount; 00164 00165 CPLFinderInit(); 00166 00167 nCount = CSLCount(papszFinderLocations); 00168 if( nCount == 0 ) 00169 return; 00170 00171 CPLFree( papszFinderLocations[nCount-1] ); 00172 papszFinderLocations[nCount-1] = NULL; 00173 } 00174 00175