Actual source code: ffpath.c
petsc-3.7.1 2016-05-15
Report Typos and Errors

      2: #include <petscsys.h>
      3: #if defined(PETSC_HAVE_PWD_H)
      4: #include <pwd.h>
      5: #endif
      6: #include <ctype.h>
      7: #include <sys/stat.h>
      8: #if defined(PETSC_HAVE_UNISTD_H)
      9: #include <unistd.h>
     10: #endif
     11: #if defined(PETSC_HAVE_SYS_UTSNAME_H)
     12: #include <sys/utsname.h>
     13: #endif
     14: #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H)
     15: #include <sys/systeminfo.h>
     16: #endif

     20: /*@C
     21:    PetscGetFileFromPath - Finds a file from a name and a path string.  A
     22:                           default can be provided.

     24:    Not Collective

     26:    Input Parameters:
     27: +  path - A string containing "directory:directory:..." (without the
     28:           quotes, of course).
     29:           As a special case, if the name is a single FILE, that file is
     30:           used.
     31: .  defname - default name
     32: .  name - file name to use with the directories from env
     33: -  mode - file mode desired (usually r for readable, w for writable, or e for
     34:           executable)

     36:    Output Parameter:
     37: .  fname - qualified file name

     39:    Level: developer

     41:    Developer Notes: Wrongly returns 1 as an error code sometimes. Maybe should have additional flag argument indicating
     42:                     if it found it.  Most arguments likely should be const.

     44:    Concepts: files^finding in path
     45:    Concepts: path^searching for file

     47: @*/
     48: PetscErrorCode  PetscGetFileFromPath(char *path,char *defname,char *name,char *fname,char mode)
     49: {
     50:   char           *p,*cdir,trial[PETSC_MAX_PATH_LEN],*senv,*env;
     51:   size_t         ln;
     53:   PetscBool      flg;

     56:   /* Setup default */
     57:   PetscGetFullPath(defname,fname,PETSC_MAX_PATH_LEN);

     59:   if (path) {
     60:     /* Check to see if the path is a valid regular FILE */
     61:     PetscTestFile(path,mode,&flg);
     62:     if (flg) {
     63:       PetscStrcpy(fname,path);
     64:       PetscFunctionReturn(1);
     65:     }

     67:     /* Make a local copy of path and mangle it */
     68:     PetscStrallocpy(path,&senv);
     69:     env  = senv;
     70:     while (env) {
     71:       /* Find next directory in env */
     72:       cdir = env;
     73:       PetscStrchr(env,PETSC_PATH_SEPARATOR,&p);
     74:       if (p) {
     75:         *p  = 0;
     76:         env = p + 1;
     77:       } else env = 0;

     79:       /* Form trial file name */
     80:       PetscStrcpy(trial,cdir);
     81:       PetscStrlen(trial,&ln);
     82:       if (trial[ln-1] != '/') trial[ln++] = '/';

     84:       PetscStrcpy(trial + ln,name);

     86:       PetscTestFile(path,mode,&flg);
     87:       if (flg) {
     88:         /* need PetscGetFullPath rather then copy in case path has . in it */
     89:         PetscGetFullPath(trial,fname,PETSC_MAX_PATH_LEN);
     90:         PetscFree(senv);
     91:         PetscFunctionReturn(1);
     92:       }
     93:     }
     94:     PetscFree(senv);
     95:   }

     97:   PetscTestFile(path,mode,&flg);
     98:   if (flg) PetscFunctionReturn(1);
     99:   return(0);
    100: }