diff options
| author | Frank Warmerdam <warmerdam@pobox.com> | 2004-09-16 15:14:01 +0000 |
|---|---|---|
| committer | Frank Warmerdam <warmerdam@pobox.com> | 2004-09-16 15:14:01 +0000 |
| commit | 2063f06aaf1a8b29e130ee5333e6711a22d0517a (patch) | |
| tree | cb6c14f172acf6bf5d1d98162fd672f77b364ab9 /src/pj_open_lib.c | |
| parent | 58ebb1f7fa898d1ccc8d2d4304227103bfde02d2 (diff) | |
| download | PROJ-2063f06aaf1a8b29e130ee5333e6711a22d0517a.tar.gz PROJ-2063f06aaf1a8b29e130ee5333e6711a22d0517a.zip | |
* src/pj_open_lib.c: added pj_set_searchpath() provided by Eric Miller.
git-svn-id: http://svn.osgeo.org/metacrs/proj/trunk@1227 4e78687f-474d-0410-85f9-8d5e500ac6b2
Diffstat (limited to 'src/pj_open_lib.c')
| -rw-r--r-- | src/pj_open_lib.c | 141 |
1 files changed, 96 insertions, 45 deletions
diff --git a/src/pj_open_lib.c b/src/pj_open_lib.c index 180c5497..e7b26ca6 100644 --- a/src/pj_open_lib.c +++ b/src/pj_open_lib.c @@ -4,7 +4,7 @@ * Project: PROJ.4 * Purpose: Implementation of pj_open_lib(), and pj_set_finder(). These * provide a standard interface for opening projections support - * data files. + * data files. * Author: Gerald Evenden, Frank Warmerdam <warmerdam@pobox.com> * ****************************************************************************** @@ -31,6 +31,9 @@ ****************************************************************************** * * $Log$ + * Revision 1.6 2004/09/16 15:14:01 fwarmerdam + * * src/pj_open_lib.c: added pj_set_searchpath() provided by Eric Miller. + * * Revision 1.5 2002/12/14 20:15:30 warmerda * updated headers * @@ -45,6 +48,8 @@ PJ_CVSID("$Id$"); static const char *(*pj_finder)(const char *) = NULL; +static int path_count = 0; +static char **search_path = NULL; static char * proj_lib_name = #ifdef PROJ_LIB PROJ_LIB; @@ -63,53 +68,99 @@ void pj_set_finder( const char *(*new_finder)(const char *) ) } /************************************************************************/ +/* pj_set_searchpath() */ +/* */ +/* Path control for callers that can't practically provide */ +/* pj_set_finder() style callbacks. */ +/************************************************************************/ + +void pj_set_searchpath ( int count, const char **path ) +{ + int i; + + if (path_count > 0 && search_path != NULL) + { + for (i = 0; i < path_count; i++) + { + pj_dalloc(search_path[i]); + } + pj_dalloc(search_path); + path_count = 0; + search_path = NULL; + } + + search_path = pj_malloc(sizeof *search_path * count); + for (i = 0; i < count; i++) + { + search_path[i] = pj_malloc(strlen(path[i]) + 1); + strcpy(search_path[i], path[i]); + } + + path_count = count; +} + +/************************************************************************/ /* pj_open_lib() */ /************************************************************************/ FILE * pj_open_lib(char *name, char *mode) { - char fname[MAX_PATH_FILENAME+1]; - const char *sysname; - FILE *fid; - int n = 0; - - /* check if ~/name */ - if (*name == '~' && name[1] == DIR_CHAR) - if (sysname = getenv("HOME")) { - (void)strcpy(fname, sysname); - fname[n = strlen(fname)] = DIR_CHAR; - fname[++n] = '\0'; - (void)strcpy(fname+n, name + 1); - sysname = fname; - } else - return NULL; - - /* or fixed path: /name, ./name or ../name */ - else if (*name == DIR_CHAR || (*name == '.' && name[1] == DIR_CHAR) || - (!strncmp(name, "..", 2) && name[2] == DIR_CHAR) ) - sysname = name; - - /* or try to use application provided file finder */ - else if( pj_finder != NULL && pj_finder( name ) != NULL ) - sysname = pj_finder( name ); - - /* or is environment PROJ_LIB defined */ - else if ((sysname = getenv("PROJ_LIB")) || (sysname = proj_lib_name)) { - (void)strcpy(fname, sysname); - fname[n = strlen(fname)] = DIR_CHAR; - fname[++n] = '\0'; - (void)strcpy(fname+n, name); - sysname = fname; - } else /* just try it bare bones */ - sysname = name; - - if (fid = fopen(sysname, mode)) - errno = 0; - - if( getenv( "PROJ_DEBUG" ) != NULL ) - fprintf( stderr, "pj_open_lib(%s): call fopen(%s) - %s\n", - name, sysname, - fid == NULL ? "failed" : "succeeded" ); - - return(fid); + char fname[MAX_PATH_FILENAME+1]; + const char *sysname; + FILE *fid; + int n = 0; + int i; + + /* check if ~/name */ + if (*name == '~' && name[1] == DIR_CHAR) + if (sysname = getenv("HOME")) { + (void)strcpy(fname, sysname); + fname[n = strlen(fname)] = DIR_CHAR; + fname[++n] = '\0'; + (void)strcpy(fname+n, name + 1); + sysname = fname; + } else + return NULL; + + /* or fixed path: /name, ./name or ../name */ + else if (*name == DIR_CHAR || (*name == '.' && name[1] == DIR_CHAR) || + (!strncmp(name, "..", 2) && name[2] == DIR_CHAR) ) + sysname = name; + + /* or try to use application provided file finder */ + else if( pj_finder != NULL && pj_finder( name ) != NULL ) + sysname = pj_finder( name ); + + /* or is environment PROJ_LIB defined */ + else if ((sysname = getenv("PROJ_LIB")) || (sysname = proj_lib_name)) { + (void)strcpy(fname, sysname); + fname[n = strlen(fname)] = DIR_CHAR; + fname[++n] = '\0'; + (void)strcpy(fname+n, name); + sysname = fname; + } else /* just try it bare bones */ + sysname = name; + + if (fid = fopen(sysname, mode)) + errno = 0; + + /* If none of those work and we have a search path, try it */ + if (!fid && path_count > 0) + { + for (i = 0; fid == NULL && i < path_count; i++) + { + sprintf(fname, "%s%c%s", search_path[i], DIR_CHAR, name); + sysname = fname; + fid = fopen (sysname, mode); + } + if (fid) + errno = 0; + } + + if( getenv( "PROJ_DEBUG" ) != NULL ) + fprintf( stderr, "pj_open_lib(%s): call fopen(%s) - %s\n", + name, sysname, + fid == NULL ? "failed" : "succeeded" ); + + return(fid); } |
