本文整理汇总了C++中CPLString::find方法的典型用法代码示例。如果您正苦于以下问题:C++ CPLString::find方法的具体用法?C++ CPLString::find怎么用?C++ CPLString::find使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CPLString
的用法示例。
在下文中一共展示了CPLString::find方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: FindChangePattern
static void FindChangePattern( char *cdata,char **substs, char **keys, CPLString &ret)
{
char **papszTokens=CSLTokenizeString2(cdata," \t\n\r",
CSLT_STRIPLEADSPACES|CSLT_STRIPENDSPACES);
ret.clear();
int matchcount=CSLCount(substs);
int keycount=CSLCount(keys);
if (keycount<matchcount)
{
CSLDestroy(papszTokens);
return;
}
// A valid string has only the keys in the substs list and none other
for (int j=0;j<CSLCount(papszTokens);j++)
{
ret=papszTokens[j]; // The target string
bool matches=true;
for (int k=0;k<keycount && keys != NULL;k++)
{
const char *key=keys[k];
int sub_number=CSLPartialFindString(substs,key);
if (sub_number!=-1)
{ // It is a listed match
// But is the match for the key position?
char *found_key=NULL;
const char *found_value=CPLParseNameValue(substs[sub_number],&found_key);
if (found_key!=NULL && EQUAL(found_key,key))
{ // Should exits in the request
if (std::string::npos==ret.find(key))
{
matches=false;
CPLFree(found_key);
break;
}
// Execute the substitution on the "ret" string
URLSearchAndReplace(&ret,key,"%s",found_value);
}
if (found_key!=NULL) CPLFree(found_key);
}
else
{ // Key not in the subst list, should not match
if (std::string::npos!=ret.find(key))
{
matches=false;
break;
}
}
} // Key loop
if (matches)
{
CSLDestroy(papszTokens);
return; // We got the string ready, all keys accounted for and substs applied
}
}
ret.clear();
CSLDestroy(papszTokens);
}
示例2: BuildFromURI
VSIOSSHandleHelper* VSIOSSHandleHelper::BuildFromURI( const char* pszURI,
const char* pszFSPrefix,
bool bAllowNoObject,
CSLConstList papszOptions )
{
CPLString osSecretAccessKey;
CPLString osAccessKeyId;
if( !GetConfiguration(papszOptions, osSecretAccessKey, osAccessKeyId) )
{
return nullptr;
}
const CPLString osEndpoint = CSLFetchNameValueDef(papszOptions,
"OSS_ENDPOINT",
CPLGetConfigOption("OSS_ENDPOINT", "oss-us-east-1.aliyuncs.com"));
CPLString osBucket;
CPLString osObjectKey;
if( pszURI != nullptr && pszURI[0] != '\0' &&
!GetBucketAndObjectKey(pszURI, pszFSPrefix, bAllowNoObject,
osBucket, osObjectKey) )
{
return nullptr;
}
const bool bUseHTTPS = CPLTestBool(CPLGetConfigOption("OSS_HTTPS", "YES"));
const bool bIsValidNameForVirtualHosting =
osBucket.find('.') == std::string::npos;
const bool bUseVirtualHosting = CPLTestBool(
CPLGetConfigOption("OSS_VIRTUAL_HOSTING",
bIsValidNameForVirtualHosting ? "TRUE" : "FALSE"));
return new VSIOSSHandleHelper(osSecretAccessKey, osAccessKeyId,
osEndpoint,
osBucket, osObjectKey, bUseHTTPS,
bUseVirtualHosting);
}
示例3: while
static CPLString GDALGMLJP2EvalExpr(const CPLString& osTemplate,
xmlXPathContextPtr pXPathCtx,
xmlDocPtr pDoc)
{
CPLString osXMLRes;
size_t nPos = 0;
while( true )
{
// Get next expression.
size_t nStartPos = osTemplate.find("{{{", nPos);
if( nStartPos == std::string::npos)
{
// Add terminating portion of the template.
osXMLRes += osTemplate.substr(nPos);
break;
}
// Add portion of template before the expression.
osXMLRes += osTemplate.substr(nPos, nStartPos - nPos);
const char* pszExpr = osTemplate.c_str() + nStartPos;
GDALGMLJP2Expr* poExpr = GDALGMLJP2Expr::Build(pszExpr, pszExpr);
if( poExpr == nullptr )
break;
nPos = static_cast<size_t>(pszExpr - osTemplate.c_str());
osXMLRes += poExpr->Evaluate(pXPathCtx,pDoc).osValue;
delete poExpr;
}
return osXMLRes;
}
示例4: URLPrepare
// Terminates an URL base with either ? or &, so extra args can be appended
void URLPrepare(CPLString &url) {
if (url.find("?") == std::string::npos) {
url.append("?");
} else {
if (*url.rbegin() != '?' && *url.rbegin() != '&')
url.append("&");
}
}
示例5: replace
void replace(CPLString& str, const char *from, const char *to) {
if(strlen(from) == 0)
return;
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, strlen(from), to);
start_pos += strlen(to); // In case 'to' contains 'from', like replacing 'x' with 'yx'
}
}
示例6: NormalizePath
void VSIMemFilesystemHandler::NormalizePath( CPLString &oPath )
{
size_t nPos = 0;
while( (nPos = oPath.find('\\', nPos)) != std::string::npos )
{
oPath[nPos] = '/';
nPos ++;
}
}
示例7: MatchesRefXPath
// This is a performance critical function, especially on geosciml schemas,
// and we make careful to not do any string copy or other memory allocation
// in it.
bool GMLASXPathMatcher::MatchesRefXPath(
const CPLString& osXPath,
const std::vector<XPathComponent>& oRefXPath) const
{
size_t iPos = 0;
size_t iIdxInRef = 0;
bool bDirectChild = oRefXPath[0].m_bDirectChild;
while( iPos < osXPath.size() && iIdxInRef < oRefXPath.size() )
{
bDirectChild = oRefXPath[iIdxInRef].m_bDirectChild;
size_t iPosNextSlash = osXPath.find('/', iPos);
bool bNodeMatch;
if( iPosNextSlash == std::string::npos )
{
bNodeMatch = osXPath.compare(iPos, std::string::npos,
oRefXPath[iIdxInRef].m_osValue) == 0;
}
else
{
bNodeMatch = osXPath.compare(iPos, iPosNextSlash - iPos,
oRefXPath[iIdxInRef].m_osValue) == 0;
}
if( !bNodeMatch )
{
if( bDirectChild )
return false;
if( iPosNextSlash == std::string::npos )
return false;
iPos = iPosNextSlash + 1;
continue;
}
if( iPosNextSlash == std::string::npos )
iPos = osXPath.size();
else
iPos = iPosNextSlash + 1;
iIdxInRef ++;
bDirectChild = true;
}
return (!bDirectChild || iPos == osXPath.size()) &&
iIdxInRef == oRefXPath.size();
}
示例8: ACAdjustText
void ACAdjustText( double dfAngle, double dfScale, OGRFeature *poFeature )
{
/* -------------------------------------------------------------------- */
/* We only try to alter text elements (LABEL styles). */
/* -------------------------------------------------------------------- */
if( poFeature->GetStyleString() == NULL )
return;
CPLString osOldStyle = poFeature->GetStyleString();
if( strstr(osOldStyle,"LABEL") == NULL )
return;
/* -------------------------------------------------------------------- */
/* Is there existing angle text? */
/* -------------------------------------------------------------------- */
double dfOldAngle = 0.0;
CPLString osPreAngle, osPostAngle;
size_t nAngleOff = osOldStyle.find( ",a:" );
if( nAngleOff != std::string::npos )
{
size_t nEndOfAngleOff = osOldStyle.find( ",", nAngleOff + 1 );
if( nEndOfAngleOff == std::string::npos )
nEndOfAngleOff = osOldStyle.find( ")", nAngleOff + 1 );
osPreAngle.assign( osOldStyle, 0, nAngleOff );
osPostAngle.assign( osOldStyle, nEndOfAngleOff, std::string::npos );
dfOldAngle = CPLAtof( osOldStyle.c_str() + nAngleOff + 3 );
}
else
{
CPLAssert( osOldStyle[osOldStyle.size()-1] == ')' );
osPreAngle.assign( osOldStyle, 0, osOldStyle.size() - 1 );
osPostAngle = ")";
}
/* -------------------------------------------------------------------- */
/* Format with the new angle. */
/* -------------------------------------------------------------------- */
CPLString osNewStyle;
osNewStyle.Printf( "%s,a:%g%s",
osPreAngle.c_str(),
dfOldAngle + dfAngle,
osPostAngle.c_str() );
osOldStyle = osNewStyle;
/* -------------------------------------------------------------------- */
/* Is there existing scale text? */
/* -------------------------------------------------------------------- */
double dfOldScale = 1.0;
CPLString osPreScale, osPostScale;
size_t nScaleOff = osOldStyle.find( ",s:" );
if( nScaleOff != std::string::npos )
{
size_t nEndOfScaleOff = osOldStyle.find( ",", nScaleOff + 1 );
if( nEndOfScaleOff == std::string::npos )
nEndOfScaleOff = osOldStyle.find( ")", nScaleOff + 1 );
osPreScale.assign( osOldStyle, 0, nScaleOff );
osPostScale.assign( osOldStyle, nEndOfScaleOff, std::string::npos );
dfOldScale = CPLAtof( osOldStyle.c_str() + nScaleOff + 3 );
}
else
{
CPLAssert( osOldStyle[osOldStyle.size()-1] == ')' );
osPreScale.assign( osOldStyle, 0, osOldStyle.size() - 1 );
osPostScale = ")";
}
/* -------------------------------------------------------------------- */
/* Format with the new scale. */
/* -------------------------------------------------------------------- */
osNewStyle.Printf( "%s,s:%gg%s",
osPreScale.c_str(),
dfOldScale * dfScale,
osPostScale.c_str() );
poFeature->SetStyleString( osNewStyle );
}
示例9: PamGetProxy
const char *PamAllocateProxy( const char *pszOriginal )
{
InitProxyDB();
if( poProxyDB == NULL )
return NULL;
CPLMutexHolderD( &hProxyDBLock );
poProxyDB->CheckLoadDB();
/* -------------------------------------------------------------------- */
/* Form the proxy filename based on the original path if */
/* possible, but dummy out any questionable characters, path */
/* delimiters and such. This is intended to make the proxy */
/* name be identifiable by folks digging around in the proxy */
/* database directory. */
/* */
/* We also need to be careful about length. */
/* -------------------------------------------------------------------- */
CPLString osRevProxyFile;
int i;
i = strlen(pszOriginal) - 1;
while( i >= 0 && osRevProxyFile.size() < 220 )
{
if( i > 6 && EQUALN(pszOriginal+i-5,":::OVR",6) )
i -= 6;
// make some effort to break long names at path delimiters.
if( (pszOriginal[i] == '/' || pszOriginal[i] == '\\')
&& osRevProxyFile.size() > 200 )
break;
if( (pszOriginal[i] >= 'A' && pszOriginal[i] <= 'Z')
|| (pszOriginal[i] >= 'a' && pszOriginal[i] <= 'z')
|| (pszOriginal[i] >= '0' && pszOriginal[i] <= '9')
|| pszOriginal[i] == '.' )
osRevProxyFile += pszOriginal[i];
else
osRevProxyFile += '_';
i--;
}
CPLString osOriginal = pszOriginal;
CPLString osProxy;
CPLString osCounter;
osProxy = poProxyDB->osProxyDBDir + "/";
osCounter.Printf( "%06d_", poProxyDB->nUpdateCounter++ );
osProxy += osCounter;
for( i = osRevProxyFile.size()-1; i >= 0; i-- )
osProxy += osRevProxyFile[i];
if( osOriginal.find(":::OVR") != CPLString::npos )
osProxy += ".ovr";
else
osProxy += ".aux.xml";
/* -------------------------------------------------------------------- */
/* Add the proxy and the original to the proxy list and resave */
/* the database. */
/* -------------------------------------------------------------------- */
poProxyDB->aosOriginalFiles.push_back( osOriginal );
poProxyDB->aosProxyFiles.push_back( osProxy );
poProxyDB->SaveDB();
return PamGetProxy( pszOriginal );
}
示例10: AddComputedAttribute
void OGROSMLayer::AddComputedAttribute(const char* pszName,
OGRFieldType eType,
const char* pszSQL)
{
if( poDS->hDBForComputedAttributes == NULL )
{
int rc;
#ifdef HAVE_SQLITE_VFS
rc = sqlite3_open_v2( ":memory:", &(poDS->hDBForComputedAttributes),
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX, NULL );
#else
rc = sqlite3_open( ":memory:", &(poDS->hDBForComputedAttributes) );
#endif
if( rc != SQLITE_OK )
{
CPLError( CE_Failure, CPLE_AppDefined,
"Cannot open temporary sqlite DB" );
return;
}
}
if( poFeatureDefn->GetFieldIndex(pszName) >= 0 )
{
CPLError( CE_Failure, CPLE_AppDefined,
"A field with same name %s already exists", pszName );
return;
}
CPLString osSQL(pszSQL);
std::vector<CPLString> aosAttrToBind;
std::vector<int> anIndexToBind;
size_t nStartSearch = 0;
while(TRUE)
{
size_t nPos = osSQL.find("[", nStartSearch);
if( nPos == std::string::npos )
break;
nStartSearch = nPos + 1;
if( nPos > 0 && osSQL[nPos-1] != '\\' )
{
CPLString osAttr = osSQL.substr(nPos + 1);
size_t nPos2 = osAttr.find("]");
if( nPos2 == std::string::npos )
break;
osAttr.resize(nPos2);
osSQL = osSQL.substr(0, nPos) + "?" + osSQL.substr(nPos + 1 + nPos2+1);
aosAttrToBind.push_back(osAttr);
anIndexToBind.push_back(poFeatureDefn->GetFieldIndex(osAttr));
}
}
while(TRUE)
{
size_t nPos = osSQL.find("\\");
if( nPos == std::string::npos || nPos == osSQL.size() - 1 )
break;
osSQL = osSQL.substr(0, nPos) + osSQL.substr(nPos + 1);
}
CPLDebug("OSM", "SQL : \"%s\"", osSQL.c_str());
sqlite3_stmt *hStmt;
int rc = sqlite3_prepare( poDS->hDBForComputedAttributes, osSQL, -1,
&hStmt, NULL );
if( rc != SQLITE_OK )
{
CPLError( CE_Failure, CPLE_AppDefined,
"sqlite3_prepare() failed : %s",
sqlite3_errmsg(poDS->hDBForComputedAttributes) );
return;
}
OGRFieldDefn oField(pszName, eType);
poFeatureDefn->AddFieldDefn(&oField);
oComputedAttributes.push_back(OGROSMComputedAttribute(pszName));
oComputedAttributes[oComputedAttributes.size()-1].eType = eType;
oComputedAttributes[oComputedAttributes.size()-1].nIndex = poFeatureDefn->GetFieldCount() - 1;
oComputedAttributes[oComputedAttributes.size()-1].osSQL = pszSQL;
oComputedAttributes[oComputedAttributes.size()-1].hStmt = hStmt;
oComputedAttributes[oComputedAttributes.size()-1].aosAttrToBind = aosAttrToBind;
oComputedAttributes[oComputedAttributes.size()-1].anIndexToBind = anIndexToBind;
}
示例11: ParseImage
//.........这里部分代码省略.........
else if (EQUAL(value,"(BAND,LINE,SAMPLE)") ) {
strcpy(szLayout,"BIP");
nBands = atoi(GetKeywordSub(osPrefix+"IMAGE.CORE_ITEMS",1));
nRows = atoi(GetKeywordSub(osPrefix+"IMAGE.CORE_ITEMS",2));
nCols = atoi(GetKeywordSub(osPrefix+"IMAGE.CORE_ITEMS",3));
}
else if (EQUAL(value,"(SAMPLE,BAND,LINE)") ) {
strcpy(szLayout,"BIL");
nCols = atoi(GetKeywordSub(osPrefix+"IMAGE.CORE_ITEMS",1));
nBands = atoi(GetKeywordSub(osPrefix+"IMAGE.CORE_ITEMS",2));
nRows = atoi(GetKeywordSub(osPrefix+"IMAGE.CORE_ITEMS",3));
}
else if ( EQUAL(value,"") ) {
strcpy(szLayout,"BSQ");
nCols = atoi(GetKeyword(osPrefix+"IMAGE.LINE_SAMPLES",""));
nRows = atoi(GetKeyword(osPrefix+"IMAGE.LINES",""));
nBands = atoi(GetKeyword(osPrefix+"IMAGE.BANDS","1"));
}
else {
CPLError( CE_Failure, CPLE_OpenFailed,
"%s layout not supported. Abort\n\n", value);
return FALSE;
}
/*********** Grab Qube record bytes **********/
record_bytes = atoi(GetKeyword(osPrefix+"IMAGE.RECORD_BYTES"));
if (record_bytes == 0)
record_bytes = atoi(GetKeyword(osPrefix+"RECORD_BYTES"));
// this can happen with "record_type = undefined".
if( record_bytes == 0 )
record_bytes = 1;
if( nQube >0 && osQube.find("<BYTES>") != CPLString::npos )
nSkipBytes = nQube - 1;
else if (nQube > 0 )
nSkipBytes = (nQube - 1) * record_bytes;
else if( nDetachedOffset > 0 )
{
if (bDetachedOffsetInBytes)
nSkipBytes = nDetachedOffset;
else
nSkipBytes = nDetachedOffset * record_bytes;
}
else
nSkipBytes = 0;
nSkipBytes += atoi(GetKeyword(osPrefix+"IMAGE.LINE_PREFIX_BYTES",""));
/*********** Grab SAMPLE_TYPE *****************/
/** if keyword not found leave as "M" or "MSB" **/
CPLString osST = GetKeyword( osPrefix+"IMAGE.SAMPLE_TYPE" );
if( osST.size() >= 2 && osST[0] == '"' && osST[osST.size()-1] == '"' )
osST = osST.substr( 1, osST.size() - 2 );
if( (EQUAL(osST,"LSB_INTEGER")) ||
(EQUAL(osST,"LSB")) || // just incase
(EQUAL(osST,"LSB_UNSIGNED_INTEGER")) ||
(EQUAL(osST,"LSB_SIGNED_INTEGER")) ||
(EQUAL(osST,"UNSIGNED_INTEGER")) ||
(EQUAL(osST,"VAX_REAL")) ||
(EQUAL(osST,"VAX_INTEGER")) ||
(EQUAL(osST,"PC_INTEGER")) || //just incase
(EQUAL(osST,"PC_REAL")) ) {
chByteOrder = 'I';
}
示例12: if
void GMLASXPathMatcher::SetDocumentMapURIToPrefix(
const std::map<CPLString,CPLString>& oMapURIToPrefix )
{
m_aosReferenceXPaths.clear();
// Split each reference XPath into its components
for(size_t i = 0; i < m_aosReferenceXPathsUncompiled.size(); ++i )
{
const CPLString& osXPath( m_aosReferenceXPathsUncompiled[i] );
std::vector<XPathComponent> oVector;
size_t iPos = 0;
bool bDirectChild = false;
if( osXPath.size() >= 2 &&
osXPath[0] == '/' && osXPath[1] == '/' )
{
iPos += 2;
}
else if( osXPath.size() >= 1 && osXPath[0] == '/' )
{
iPos += 1;
bDirectChild = true;
}
while( iPos < osXPath.size() )
{
size_t iPosNextSlash = osXPath.find('/', iPos);
if( iPos == iPosNextSlash )
{
bDirectChild = false;
iPos ++;
continue;
}
CPLString osCurNode;
if( iPosNextSlash == std::string::npos )
osCurNode.assign(osXPath, iPos, std::string::npos);
else
osCurNode.assign(osXPath, iPos, iPosNextSlash - iPos);
// Translate the configuration prefix to the equivalent in
// this current schema
size_t iPosColumn = osCurNode.find(':');
if( iPosColumn != std::string::npos )
{
bool bIsAttr = ( osCurNode[0] == '@' );
CPLString osPrefix;
CPLString osLocalname;
osPrefix.assign(osCurNode,
bIsAttr ? 1 : 0,
iPosColumn - (bIsAttr ? 1 : 0));
osLocalname.assign(osCurNode, iPosColumn+1,
std::string::npos);
std::map<CPLString, CPLString>::const_iterator oIter =
m_oMapPrefixToURIReferenceXPaths.find(osPrefix);
if( oIter != m_oMapPrefixToURIReferenceXPaths.end() )
{
const CPLString& osURI( oIter->second );
oIter = oMapURIToPrefix.find( osURI );
if( oIter == oMapURIToPrefix.end() )
break;
osPrefix.assign(oIter->second);
}
osCurNode.clear();
if( bIsAttr )
osCurNode.append(1, '@');
osCurNode.append(osPrefix);
osCurNode.append(1, ':');
osCurNode.append(osLocalname);
}
XPathComponent comp;
comp.m_osValue = osCurNode;
comp.m_bDirectChild = bDirectChild;
oVector.push_back(comp);
if( iPosNextSlash == std::string::npos )
iPos = osXPath.size();
else
iPos = iPosNextSlash + 1;
bDirectChild = true;
}
if ( iPos < osXPath.size() )
oVector.clear();
m_aosReferenceXPaths.push_back(oVector);
}
}
示例13: oHolder
VSIVirtualHandle *
VSIMemFilesystemHandler::Open( const char *pszFilename,
const char *pszAccess,
bool bSetError )
{
CPLMutexHolder oHolder( &hMutex );
CPLString osFilename = pszFilename;
NormalizePath( osFilename );
if( osFilename.empty() )
return nullptr;
vsi_l_offset nMaxLength = GUINTBIG_MAX;
const size_t iPos = osFilename.find("||maxlength=");
if( iPos != std::string::npos )
{
nMaxLength = static_cast<vsi_l_offset>(CPLAtoGIntBig(
osFilename.substr(iPos + strlen("||maxlength=")).c_str()));
}
/* -------------------------------------------------------------------- */
/* Get the filename we are opening, create if needed. */
/* -------------------------------------------------------------------- */
VSIMemFile *poFile = nullptr;
if( oFileList.find(osFilename) != oFileList.end() )
poFile = oFileList[osFilename];
// If no file and opening in read, error out.
if( strstr(pszAccess, "w") == nullptr
&& strstr(pszAccess, "a") == nullptr
&& poFile == nullptr )
{
if( bSetError )
{
VSIError(VSIE_FileError, "No such file or directory");
}
errno = ENOENT;
return nullptr;
}
// Create.
if( poFile == nullptr )
{
poFile = new VSIMemFile;
poFile->osFilename = osFilename;
oFileList[poFile->osFilename] = poFile;
CPLAtomicInc(&(poFile->nRefCount)); // For file list.
poFile->nMaxLength = nMaxLength;
}
// Overwrite
else if( strstr(pszAccess, "w") )
{
poFile->SetLength(0);
poFile->nMaxLength = nMaxLength;
}
if( poFile->bIsDirectory )
{
errno = EISDIR;
return nullptr;
}
/* -------------------------------------------------------------------- */
/* Setup the file handle on this file. */
/* -------------------------------------------------------------------- */
VSIMemHandle *poHandle = new VSIMemHandle;
poHandle->poFile = poFile;
poHandle->m_nOffset = 0;
poHandle->bEOF = false;
poHandle->bUpdate =
strstr(pszAccess, "w") ||
strstr(pszAccess, "+") ||
strstr(pszAccess, "a");
CPLAtomicInc(&(poFile->nRefCount));
if( strstr(pszAccess, "a") )
poHandle->m_nOffset = poFile->nLength;
return poHandle;
}
示例14: if
static CPLString GetProj4Filename(const char* pszFilename)
{
CPLString osFilename;
/* or fixed path: /name, ./name or ../name */
if ( !CPLIsFilenameRelative(pszFilename) || *pszFilename == '.' )
{
return pszFilename;
}
#if defined(PROJ_STATIC) && PROJ_VERSION >= 5
PJ_GRID_INFO info = proj_grid_info(pszFilename);
if( info.filename[0] )
{
osFilename = info.filename;
}
#elif defined(PROJ_STATIC) && PJ_VERSION > 493
osFilename.resize(2048);
projCtx ctx = pj_ctx_alloc();
if( pj_find_file(ctx, pszFilename, &osFilename[0], osFilename.size()) )
{
osFilename.resize( strlen(osFilename) );
}
else
{
osFilename.clear();
}
pj_ctx_free(ctx);
#else
// Transpose some of the proj.4 pj_open_lib() logic...
/* check if ~/name */
char* pszSysname;
if (*pszFilename == '~' &&
(pszFilename[1] == '/' || pszFilename[1] == '\\') )
{
if ((pszSysname = getenv("HOME")) != nullptr)
{
osFilename = CPLFormFilename(pszSysname, pszFilename + 1, nullptr);
}
return osFilename;
}
/* or is environment PROJ_LIB defined */
else if ((pszSysname = getenv("PROJ_LIB")) != nullptr)
{
osFilename = CPLFormFilename(pszSysname, pszFilename, nullptr);
VSIStatBufL sStat;
if( VSIStatL(osFilename, &sStat) == 0 )
return osFilename;
osFilename.clear();
}
#if defined(PROJ_STATIC) && PJ_VERSION >= 490
// Super messy. proj.4 up to 4.9.3 had no public API to return the full
// path to a resource file, so we rely on the fact that it emits a log
// message with it...
// Basically this is needed in the case where the file is in the
// resource installation directory of proj.4, which we have no way to
// know otherwise.
CPLString osMsg;
projCtx ctx = pj_ctx_alloc();
pj_ctx_set_app_data(ctx, &osMsg);
pj_ctx_set_debug(ctx, PJ_LOG_DEBUG_MAJOR);
pj_ctx_set_logger(ctx, my_proj4_logger);
PAFile f = pj_open_lib(ctx, pszFilename, "rb");
if( f )
{
pj_ctx_fclose(ctx, f);
size_t nPos = osMsg.find("fopen(");
if( nPos != std::string::npos )
{
osFilename = osMsg.substr(nPos + strlen("fopen("));
nPos = osFilename.find(")");
if( nPos != std::string::npos )
osFilename = osFilename.substr(0, nPos);
}
}
pj_ctx_free(ctx);
#endif
#endif
return osFilename;
}