Actual source code: ffpath.c

  1: #define PETSC_DLL

 3:  #include petsc.h
 4:  #include petscsys.h
  5: #if defined(PETSC_HAVE_PWD_H)
  6: #include <pwd.h>
  7: #endif
  8: #include <ctype.h>
  9: #include <sys/types.h>
 10: #include <sys/stat.h>
 11: #if defined(PETSC_HAVE_UNISTD_H)
 12: #include <unistd.h>
 13: #endif
 14: #if defined(PETSC_HAVE_STDLIB_H)
 15: #include <stdlib.h>
 16: #endif
 17: #if defined(PETSC_HAVE_SYS_UTSNAME_H)
 18: #include <sys/utsname.h>
 19: #endif
 20: #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H)
 21: #include <sys/systeminfo.h>
 22: #endif
 23: #include "petscfix.h"

 27: /*@C
 28:    PetscGetFileFromPath - Finds a file from a name and a path string.  A 
 29:                           default can be provided.

 31:    Not Collective

 33:    Input Parameters:
 34: +  path - A string containing "directory:directory:..." (without the
 35:           quotes, of course).
 36:           As a special case, if the name is a single FILE, that file is
 37:           used.
 38: .  defname - default name
 39: .  name - file name to use with the directories from env
 40: -  mode - file mode desired (usually r for readable, w for writable, or e for
 41:           executable)

 43:    Output Parameter:
 44: .  fname - qualified file name

 46:    Level: developer

 48:    Concepts: files^finding in path
 49:    Concepts: path^searching for file

 51: @*/
 52: PetscErrorCode  PetscGetFileFromPath(char *path,char *defname,char *name,char *fname,char mode)
 53: {
 54:   char       *p,*cdir,trial[PETSC_MAX_PATH_LEN],*senv,*env;
 55:   size_t     ln;
 57:   PetscTruth flg;

 60:   /* Setup default */
 61:   PetscGetFullPath(defname,fname,PETSC_MAX_PATH_LEN);

 63:   if (path) {
 64:     /* Check to see if the path is a valid regular FILE */
 65:     PetscTestFile(path,mode,&flg);
 66:     if (flg) {
 67:       PetscStrcpy(fname,path);
 68:       PetscFunctionReturn(1);
 69:     }
 70: 
 71:     /* Make a local copy of path and mangle it */
 72:     PetscStrallocpy(path,&senv);
 73:     env  = senv;
 74:     while (env) {
 75:       /* Find next directory in env */
 76:       cdir = env;
 77:       PetscStrchr(env,PETSC_PATH_SEPARATOR,&p);
 78:       if (p) {
 79:         *p  = 0;
 80:         env = p + 1;
 81:       } else
 82:         env = 0;

 84:       /* Form trial file name */
 85:       PetscStrcpy(trial,cdir);
 86:       PetscStrlen(trial,&ln);
 87:       if (trial[ln-1] != '/')  trial[ln++] = '/';
 88: 
 89:       PetscStrcpy(trial + ln,name);

 91:       PetscTestFile(path,mode,&flg);
 92:       if (flg) {
 93:         /* need PetscGetFullPath rather then copy in case path has . in it */
 94:         PetscGetFullPath(trial,fname,PETSC_MAX_PATH_LEN);
 95:         PetscFree(senv);
 96:         PetscFunctionReturn(1);
 97:       }
 98:     }
 99:     PetscFree(senv);
100:   }

102:   PetscTestFile(path,mode,&flg);
103:   if (flg) PetscFunctionReturn(1);
104:   return(0);
105: }