Merge remote-tracking branch 'gerrit/release-4-6'
[alexxy/gromacs.git] / src / gromacs / utility / path.cpp
1 /*
2  *
3  *                This source code is part of
4  *
5  *                 G   R   O   M   A   C   S
6  *
7  *          GROningen MAchine for Chemical Simulations
8  *
9  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11  * Copyright (c) 2001-2009, The GROMACS development team,
12  * check out http://www.gromacs.org for more information.
13  *
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License
16  * as published by the Free Software Foundation; either version 2
17  * of the License, or (at your option) any later version.
18  *
19  * If you want to redistribute modifications, please consider that
20  * scientific software is very special. Version control is crucial -
21  * bugs must be traceable. We will be happy to consider code for
22  * inclusion in the official distribution, but derived work must not
23  * be called official GROMACS. Details are found in the README & COPYING
24  * files - if they are missing, get the official version at www.gromacs.org.
25  *
26  * To help us fund GROMACS development, we humbly ask that you cite
27  * the papers on the package - you can find them in the top README file.
28  *
29  * For more info, check our website at http://www.gromacs.org
30  */
31 /*! \internal \file
32  * \brief
33  * Implements functions in path.h.
34  *
35  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
36  * \ingroup module_utility
37  */
38 #include "path.h"
39
40 #include <errno.h>
41 #include <sys/stat.h>
42
43 #if ((defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64) && !defined __CYGWIN__ && !defined __CYGWIN32__)
44 #include <direct.h>
45 #endif
46
47 static const char cDirSeparator = '/';
48
49 namespace gmx
50 {
51
52 std::string Path::join(const std::string &path1,
53                        const std::string &path2)
54 {
55     // TODO: Remove extra separators if they are present in the input paths.
56     return path1 + cDirSeparator + path2;
57 }
58
59
60 std::string Path::join(const std::string &path1,
61                        const std::string &path2,
62                        const std::string &path3)
63 {
64     // TODO: Remove extra separators if they are present in the input paths.
65     return path1 + cDirSeparator + path2 + cDirSeparator + path3;
66 }
67
68
69 int Directory::create(const char *path)
70 {
71     if (Directory::exists(path))
72     {
73         return 0;
74     }
75 #if ((defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64) && !defined __CYGWIN__ && !defined __CYGWIN32__)
76     if (_mkdir(path))
77 #else
78     if (mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH) != 0)
79 #endif
80     {
81         // TODO: Proper error handling.
82         return -1;
83     }
84     return 0;
85 }
86
87
88 int Directory::create(const std::string &path)
89 {
90     return create(path.c_str());
91 }
92
93
94 bool Directory::exists(const char *path)
95 {
96     struct stat info;
97     if (stat(path, &info) != 0)
98     {
99         if (errno != ENOENT && errno != ENOTDIR)
100         {
101             // TODO: Proper error handling.
102         }
103         return false;
104     }
105 #if ((defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64) && !defined __CYGWIN__ && !defined __CYGWIN32__)
106     return ((_S_IFDIR & info.st_mode) != 0);
107 #else
108     return S_ISDIR(info.st_mode);
109 #endif
110 }
111
112
113 bool Directory::exists(const std::string &path)
114 {
115     return exists(path.c_str());
116 }
117
118 } // namespace gmx