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