xref: /petsc/src/sys/fileio/ghome.c (revision e4094ef18e7e53fda86cf35f3a47fda48a8e77d8)
1 
2 /*
3       Code for manipulating files.
4 */
5 #include <petscsys.h>
6 
7 /*@C
8   PetscGetHomeDirectory - Returns the name of the user's home directory
9 
10   Not Collective
11 
12   Input Parameter:
13 . maxlen - maximum length allowed
14 
15   Output Parameter:
16 . dir - contains the home directory. Must be long enough to hold the name.
17 
18   Level: developer
19 
20   Notes:
21   If PETSc cannot determine the home directory it makes `dir` an empty string
22 
23   On Microsoft Windows machines the environmental variable `HOME` specifies the home directory.
24 
25 .seealso: `PetscGetTmp()`, `PetscSharedTmp()`, `PetscGetWorkingDirectory()`
26 @*/
27 PetscErrorCode PetscGetHomeDirectory(char dir[], size_t maxlen)
28 {
29   const char *d1;
30 
31   PetscFunctionBegin;
32   d1 = getenv("HOME");
33   if (d1) {
34     PetscCall(PetscStrncpy(dir, d1, maxlen));
35   } else if (maxlen > 0) dir[0] = 0;
36   PetscFunctionReturn(PETSC_SUCCESS);
37 }
38 
39 /*@C
40   PetscFixFilename - Fixes a file name so that it is correct for both Unix and
41   Microsoft Windows by using the correct / or \ to separate directories.
42 
43   Not Collective
44 
45   Input Parameter:
46 . filein - name of file to be fixed
47 
48   Output Parameter:
49 . fileout - the fixed name. Should long enough to hold the filename.
50 
51   Level: developer
52 
53 @*/
54 PetscErrorCode PetscFixFilename(const char filein[], char fileout[])
55 {
56   size_t i, n;
57 
58   PetscFunctionBegin;
59   if (!filein || !fileout) PetscFunctionReturn(PETSC_SUCCESS);
60 
61   PetscCall(PetscStrlen(filein, &n));
62   for (i = 0; i < n; i++) {
63     if (filein[i] == PETSC_REPLACE_DIR_SEPARATOR) fileout[i] = PETSC_DIR_SEPARATOR;
64     else fileout[i] = filein[i];
65   }
66   fileout[n] = 0;
67   PetscFunctionReturn(PETSC_SUCCESS);
68 }
69