static int LoadProjLibrary() { CPLMutexHolderD( &hPROJMutex ); static int bTriedToLoad = FALSE; const char *pszLibName; if( bTriedToLoad ) return( pfn_pj_transform != NULL ); bTriedToLoad = TRUE; pszLibName = GetProjLibraryName(); #ifdef PROJ_STATIC pfn_pj_init = pj_init; pfn_pj_init_plus = pj_init_plus; pfn_pj_free = pj_free; pfn_pj_transform = pj_transform; pfn_pj_get_errno_ref = (int *(*)(void)) pj_get_errno_ref; pfn_pj_strerrno = pj_strerrno; pfn_pj_dalloc = pj_dalloc; #if PJ_VERSION >= 446 pfn_pj_get_def = pj_get_def; #endif #if PJ_VERSION >= 480 pfn_pj_ctx_alloc = pj_ctx_alloc; pfn_pj_ctx_free = pj_ctx_free; pfn_pj_init_plus_ctx = pj_init_plus_ctx; pfn_pj_ctx_get_errno = pj_ctx_get_errno; #endif #else CPLPushErrorHandler( CPLQuietErrorHandler ); pfn_pj_init = (projPJ (*)(int, char**)) CPLGetSymbol( pszLibName, "pj_init" ); CPLPopErrorHandler(); if( pfn_pj_init == NULL ) return( FALSE ); pfn_pj_init_plus = (projPJ (*)(const char *)) CPLGetSymbol( pszLibName, "pj_init_plus" ); pfn_pj_free = (void (*)(projPJ)) CPLGetSymbol( pszLibName, "pj_free" ); pfn_pj_transform = (int (*)(projPJ,projPJ,long,int,double*, double*,double*)) CPLGetSymbol( pszLibName, "pj_transform" ); pfn_pj_get_errno_ref = (int *(*)(void)) CPLGetSymbol( pszLibName, "pj_get_errno_ref" ); pfn_pj_strerrno = (char *(*)(int)) CPLGetSymbol( pszLibName, "pj_strerrno" ); CPLPushErrorHandler( CPLQuietErrorHandler ); pfn_pj_get_def = (char *(*)(projPJ,int)) CPLGetSymbol( pszLibName, "pj_get_def" ); pfn_pj_dalloc = (void (*)(void*)) CPLGetSymbol( pszLibName, "pj_dalloc" ); /* PROJ 4.8.0 symbols */ pfn_pj_ctx_alloc = (projCtx (*)( void )) CPLGetSymbol( pszLibName, "pj_ctx_alloc" ); pfn_pj_ctx_free = (void (*)( projCtx )) CPLGetSymbol( pszLibName, "pj_ctx_free" ); pfn_pj_init_plus_ctx = (projPJ (*)( projCtx, const char * )) CPLGetSymbol( pszLibName, "pj_init_plus_ctx" ); pfn_pj_ctx_get_errno = (int (*)( projCtx )) CPLGetSymbol( pszLibName, "pj_ctx_get_errno" ); CPLPopErrorHandler(); CPLErrorReset(); #endif if (pfn_pj_ctx_alloc != NULL && pfn_pj_ctx_free != NULL && pfn_pj_init_plus_ctx != NULL && pfn_pj_ctx_get_errno != NULL && CSLTestBoolean(CPLGetConfigOption("USE_PROJ_480_FEATURES", "YES"))) { CPLDebug("OGRCT", "PROJ >= 4.8.0 features enabled"); } else { pfn_pj_ctx_alloc = NULL; pfn_pj_ctx_free = NULL; pfn_pj_init_plus_ctx = NULL; pfn_pj_ctx_get_errno = NULL; } if( pfn_pj_transform == NULL ) { CPLError( CE_Failure, CPLE_AppDefined, "Attempt to load %s, but couldn't find pj_transform.\n" "Please upgrade to PROJ 4.1.2 or later.", pszLibName ); return FALSE; } return( TRUE ); }
static bool LoadProjLibrary_unlocked() { static bool bTriedToLoad = false; if( bTriedToLoad ) return pfn_pj_transform != NULL; bTriedToLoad = true; const char *pszLibName = GetProjLibraryName(); #ifdef PROJ_STATIC pfn_pj_init = pj_init; pfn_pj_init_plus = pj_init_plus; pfn_pj_free = pj_free; pfn_pj_transform = pj_transform; pfn_pj_get_errno_ref = (int *(*)(void)) pj_get_errno_ref; pfn_pj_strerrno = pj_strerrno; pfn_pj_dalloc = pj_dalloc; #if PJ_VERSION >= 446 pfn_pj_get_def = pj_get_def; #endif #if PJ_VERSION >= 480 pfn_pj_ctx_alloc = pj_ctx_alloc; pfn_pj_ctx_free = pj_ctx_free; pfn_pj_init_plus_ctx = pj_init_plus_ctx; pfn_pj_ctx_get_errno = pj_ctx_get_errno; #endif #else CPLPushErrorHandler( CPLQuietErrorHandler ); /* coverity[tainted_string] */ pfn_pj_init = (projPJ (*)(int, char**)) CPLGetSymbol( pszLibName, "pj_init" ); CPLPopErrorHandler(); if( pfn_pj_init == NULL ) return false; pfn_pj_init_plus = (projPJ (*)(const char *)) CPLGetSymbol( pszLibName, "pj_init_plus" ); pfn_pj_free = (void (*)(projPJ)) CPLGetSymbol( pszLibName, "pj_free" ); pfn_pj_transform = (int (*)(projPJ,projPJ,long,int,double*, double*,double*)) CPLGetSymbol( pszLibName, "pj_transform" ); pfn_pj_get_errno_ref = (int *(*)(void)) CPLGetSymbol( pszLibName, "pj_get_errno_ref" ); pfn_pj_strerrno = (char *(*)(int)) CPLGetSymbol( pszLibName, "pj_strerrno" ); CPLPushErrorHandler( CPLQuietErrorHandler ); pfn_pj_get_def = (char *(*)(projPJ,int)) CPLGetSymbol( pszLibName, "pj_get_def" ); pfn_pj_dalloc = (void (*)(void*)) CPLGetSymbol( pszLibName, "pj_dalloc" ); /* PROJ 4.8.0 symbols */ pfn_pj_ctx_alloc = (projCtx (*)( void )) CPLGetSymbol( pszLibName, "pj_ctx_alloc" ); pfn_pj_ctx_free = (void (*)( projCtx )) CPLGetSymbol( pszLibName, "pj_ctx_free" ); pfn_pj_init_plus_ctx = (projPJ (*)( projCtx, const char * )) CPLGetSymbol( pszLibName, "pj_init_plus_ctx" ); pfn_pj_ctx_get_errno = (int (*)( projCtx )) CPLGetSymbol( pszLibName, "pj_ctx_get_errno" ); bProjLocaleSafe = CPLGetSymbol(pszLibName, "pj_atof") != NULL; CPLPopErrorHandler(); CPLErrorReset(); #endif if (pfn_pj_ctx_alloc != NULL && pfn_pj_ctx_free != NULL && pfn_pj_init_plus_ctx != NULL && pfn_pj_ctx_get_errno != NULL && CPLTestBool(CPLGetConfigOption("USE_PROJ_480_FEATURES", "YES"))) { CPLDebug("OGRCT", "PROJ >= 4.8.0 features enabled"); } else { pfn_pj_ctx_alloc = NULL; pfn_pj_ctx_free = NULL; pfn_pj_init_plus_ctx = NULL; pfn_pj_ctx_get_errno = NULL; } if( bProjLocaleSafe ) CPLDebug("OGRCT", "Using locale-safe proj version"); if( pfn_pj_transform == NULL ) { CPLError( CE_Failure, CPLE_AppDefined, "Attempt to load %s, but couldn't find pj_transform.\n" "Please upgrade to PROJ 4.1.2 or later.", pszLibName ); return false; } return true; }