Actual source code: rpath.c

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

     17: /*@C
     18:   PetscGetRelativePath - Given a filename, returns the relative path (removes
     19:   all directory specifiers).

     21:   Not Collective; No Fortran Support

     23:   Input Parameters:
     24: + fullpath - full pathname
     25: - flen     - size of `path`

     27:   Output Parameter:
     28: . path - buffer that holds relative pathname

     30:   Level: developer

     32: .seealso: `PetscGetFullPath()`
     33: @*/
     34: PetscErrorCode PetscGetRelativePath(const char fullpath[], char path[], size_t flen)
     35: {
     36:   char *p = NULL;

     38:   PetscFunctionBegin;
     39:   /* Find string after last / or entire string if no / */
     40:   PetscCall(PetscStrrchr(fullpath, '/', &p));
     41:   PetscCall(PetscStrncpy(path, p, flen));
     42:   PetscFunctionReturn(PETSC_SUCCESS);
     43: }