xref: /petsc/src/sys/fileio/ghome.c (revision 10450e9e44b354a0a3da7bbd573407bdf051df10)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay       Code for manipulating files.
4e5c89e4eSSatish Balay */
5c6db04a5SJed Brown #include <petscsys.h>
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay /*@C
821532e8aSBarry Smith   PetscGetHomeDirectory - Returns the name of the user's home directory
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:
21bfbbc7b7SBarry Smith   If PETSc cannot determine the home directory it makes `dir` an empty string
22e5c89e4eSSatish Balay 
23bfbbc7b7SBarry 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
41bfbbc7b7SBarry 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 
5121532e8aSBarry Smith   Level: developer
52e5c89e4eSSatish Balay 
53*10450e9eSJacob Faibussowitsch .seealso: `PetscFOpen()`
54e5c89e4eSSatish Balay @*/
55d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscFixFilename(const char filein[], char fileout[])
56d71ae5a4SJacob Faibussowitsch {
57e5c89e4eSSatish Balay   size_t i, n;
58e5c89e4eSSatish Balay 
59e5c89e4eSSatish Balay   PetscFunctionBegin;
603ba16761SJacob Faibussowitsch   if (!filein || !fileout) PetscFunctionReturn(PETSC_SUCCESS);
61e5c89e4eSSatish Balay 
629566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(filein, &n));
63e5c89e4eSSatish Balay   for (i = 0; i < n; i++) {
64e5c89e4eSSatish Balay     if (filein[i] == PETSC_REPLACE_DIR_SEPARATOR) fileout[i] = PETSC_DIR_SEPARATOR;
65e5c89e4eSSatish Balay     else fileout[i] = filein[i];
66e5c89e4eSSatish Balay   }
67e5c89e4eSSatish Balay   fileout[n] = 0;
683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
69e5c89e4eSSatish Balay }
70