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