Merge remote-tracking branch 'origin/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 "gmx_header_config.h"
41
42 #include <errno.h>
43 #include <sys/stat.h>
44
45 #ifdef GMX_NATIVE_WINDOWS
46 #include <direct.h>
47 #endif
48
49 static const char cDirSeparator = '/';
50 static const char cDirSeparators[] = "/\\";
51
52 namespace gmx
53 {
54
55 std::string Path::join(const std::string &path1,
56                        const std::string &path2)
57 {
58     // TODO: Remove extra separators if they are present in the input paths.
59     return path1 + cDirSeparator + path2;
60 }
61
62
63 std::string Path::join(const std::string &path1,
64                        const std::string &path2,
65                        const std::string &path3)
66 {
67     // TODO: Remove extra separators if they are present in the input paths.
68     return path1 + cDirSeparator + path2 + cDirSeparator + path3;
69 }
70
71 std::pair<std::string, std::string>
72 Path::splitToPathAndFilename(const std::string &path)
73 {
74     size_t pos = path.find_last_of(cDirSeparators);
75     if (pos == std::string::npos)
76     {
77         return std::make_pair(std::string(), path);
78     }
79     return std::make_pair(path.substr(0, pos), path.substr(pos+1));
80 }
81
82
83 int Directory::create(const char *path)
84 {
85     if (Directory::exists(path))
86     {
87         return 0;
88     }
89 #ifdef GMX_NATIVE_WINDOWS
90     if (_mkdir(path))
91 #else
92     if (mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH) != 0)
93 #endif
94     {
95         // TODO: Proper error handling.
96         return -1;
97     }
98     return 0;
99 }
100
101
102 int Directory::create(const std::string &path)
103 {
104     return create(path.c_str());
105 }
106
107
108 bool Directory::exists(const char *path)
109 {
110     struct stat info;
111     if (stat(path, &info) != 0)
112     {
113         if (errno != ENOENT && errno != ENOTDIR)
114         {
115             // TODO: Proper error handling.
116         }
117         return false;
118     }
119 #ifdef GMX_NATIVE_WINDOWS
120     return ((_S_IFDIR & info.st_mode) != 0);
121 #else
122     return S_ISDIR(info.st_mode);
123 #endif
124 }
125
126
127 bool Directory::exists(const std::string &path)
128 {
129     return exists(path.c_str());
130 }
131
132 } // namespace gmx