17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Code for manipulating files. 4e5c89e4eSSatish Balay */ 5c6db04a5SJed Brown #include <petscsys.h> 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay /*@C 8e5c89e4eSSatish Balay PetscGetHomeDirectory - Returns home directory name. 9e5c89e4eSSatish Balay 10e5c89e4eSSatish Balay Not Collective 11e5c89e4eSSatish Balay 12e5c89e4eSSatish Balay Input Parameter: 13da81f932SPierre Jolivet . maxlen - maximum length allowed 14e5c89e4eSSatish Balay 15e5c89e4eSSatish Balay Output Parameter: 16e5c89e4eSSatish Balay . dir - contains the home directory. Must be long enough to hold the name. 17e5c89e4eSSatish Balay 18e5c89e4eSSatish Balay Level: developer 19e5c89e4eSSatish Balay 20811af0c4SBarry Smith Notes: 21*bfbbc7b7SBarry Smith If PETSc cannot determine the home directory it makes `dir` an empty string 22e5c89e4eSSatish Balay 23*bfbbc7b7SBarry Smith On Microsoft Windows machines the environmental variable `HOME` specifies the home directory. 24e5c89e4eSSatish Balay 25811af0c4SBarry Smith .seealso: `PetscGetTmp()`, `PetscSharedTmp()`, `PetscGetWorkingDirectory()` 26e5c89e4eSSatish Balay @*/ 27d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetHomeDirectory(char dir[], size_t maxlen) 28d71ae5a4SJacob Faibussowitsch { 2945082d64SJed Brown const char *d1; 30e5c89e4eSSatish Balay 31e5c89e4eSSatish Balay PetscFunctionBegin; 32e5c89e4eSSatish Balay d1 = getenv("HOME"); 33e5c89e4eSSatish Balay if (d1) { 349566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(dir, d1, maxlen)); 35a297a907SKarl Rupp } else if (maxlen > 0) dir[0] = 0; 363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 37e5c89e4eSSatish Balay } 38e5c89e4eSSatish Balay 39e5c89e4eSSatish Balay /*@C 40e5c89e4eSSatish Balay PetscFixFilename - Fixes a file name so that it is correct for both Unix and 41*bfbbc7b7SBarry Smith Microsoft Windows by using the correct / or \ to separate directories. 42e5c89e4eSSatish Balay 43e5c89e4eSSatish Balay Not Collective 44e5c89e4eSSatish Balay 45e5c89e4eSSatish Balay Input Parameter: 46e5c89e4eSSatish Balay . filein - name of file to be fixed 47e5c89e4eSSatish Balay 48e5c89e4eSSatish Balay Output Parameter: 49e5c89e4eSSatish Balay . fileout - the fixed name. Should long enough to hold the filename. 50e5c89e4eSSatish Balay 51e5c89e4eSSatish Balay Level: advanced 52e5c89e4eSSatish Balay 53811af0c4SBarry Smith Note: 54*bfbbc7b7SBarry Smith Call `PetscFixFilename()` just before calling `fopen()`. 55e5c89e4eSSatish Balay @*/ 56d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscFixFilename(const char filein[], char fileout[]) 57d71ae5a4SJacob Faibussowitsch { 58e5c89e4eSSatish Balay size_t i, n; 59e5c89e4eSSatish Balay 60e5c89e4eSSatish Balay PetscFunctionBegin; 613ba16761SJacob Faibussowitsch if (!filein || !fileout) PetscFunctionReturn(PETSC_SUCCESS); 62e5c89e4eSSatish Balay 639566063dSJacob Faibussowitsch PetscCall(PetscStrlen(filein, &n)); 64e5c89e4eSSatish Balay for (i = 0; i < n; i++) { 65e5c89e4eSSatish Balay if (filein[i] == PETSC_REPLACE_DIR_SEPARATOR) fileout[i] = PETSC_DIR_SEPARATOR; 66e5c89e4eSSatish Balay else fileout[i] = filein[i]; 67e5c89e4eSSatish Balay } 68e5c89e4eSSatish Balay fileout[n] = 0; 693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 70e5c89e4eSSatish Balay } 71