diff options
Diffstat (limited to 'src/open_lib.cpp')
| -rw-r--r-- | src/open_lib.cpp | 57 |
1 files changed, 24 insertions, 33 deletions
diff --git a/src/open_lib.cpp b/src/open_lib.cpp index 510704e9..01f626e8 100644 --- a/src/open_lib.cpp +++ b/src/open_lib.cpp @@ -34,6 +34,7 @@ #define FROM_PROJ_CPP #endif +#include <assert.h> #include <errno.h> #include <stddef.h> #include <stdio.h> @@ -194,15 +195,30 @@ pj_open_lib_ex(projCtx ctx, const char *name, const char *mode, sysname = name; /* or try to use application provided file finder */ - else if( ctx && ctx->file_finder != nullptr && (sysname = ctx->file_finder( ctx, name, ctx->file_finder_user_data )) != nullptr ) + else if( ctx->file_finder != nullptr && (sysname = ctx->file_finder( ctx, name, ctx->file_finder_user_data )) != nullptr ) ; - else if( ctx && ctx->file_finder_legacy != nullptr && (sysname = ctx->file_finder_legacy( name )) != nullptr ) + else if( ctx->file_finder_legacy != nullptr && (sysname = ctx->file_finder_legacy( name )) != nullptr ) ; - /* or is environment PROJ_LIB defined */ + /* The user has search paths set */ + else if( !ctx->search_paths.empty() ) { + for( const auto& path: ctx->search_paths ) { + try { + fname = path; + fname += DIR_CHAR; + fname += name; + sysname = fname.c_str(); + fid = pj_ctx_fopen(ctx, sysname, mode); + } catch( const std::exception& ) + { + } + if( fid ) + break; + } + } + /* if is environment PROJ_LIB defined */ else if ((sysname = getenv("PROJ_LIB")) != nullptr) { - auto paths = NS_PROJ::internal::split(std::string(sysname), dirSeparator); for( const auto& path: paths ) { fname = path; @@ -213,16 +229,18 @@ pj_open_lib_ex(projCtx ctx, const char *name, const char *mode, if( fid ) break; } - /* or hardcoded path */ } else if ((sysname = proj_lib_name) != nullptr) { fname = sysname; fname += DIR_CHAR; fname += name; sysname = fname.c_str(); - } else /* just try it bare bones */ + /* just try it bare bones */ + } else { sysname = name; + } + assert(sysname); // to make Coverity Scan happy if ( fid != nullptr || (fid = pj_ctx_fopen(ctx, sysname, mode)) != nullptr) { if( out_full_filename != nullptr && out_full_filename_size > 0 ) @@ -233,33 +251,6 @@ pj_open_lib_ex(projCtx ctx, const char *name, const char *mode, errno = 0; } - /* If none of those work and we have a search path, try it */ - if (!fid && ctx && !ctx->search_paths.empty() ) - { - for( const auto& path: ctx->search_paths ) { - try { - fname = path; - fname += DIR_CHAR; - fname += name; - sysname = fname.c_str(); - fid = pj_ctx_fopen(ctx, sysname, mode); - } catch( const std::exception& ) - { - } - if( fid ) - break; - } - if (fid) - { - if( out_full_filename != nullptr && out_full_filename_size > 0 ) - { - strncpy(out_full_filename, sysname, out_full_filename_size); - out_full_filename[out_full_filename_size-1] = '\0'; - } - errno = 0; - } - } - if( ctx->last_errno == 0 && errno != 0 ) pj_ctx_set_errno( ctx, errno ); |
