Use GMX_NATIVE_WINDOWS in path.cpp.
[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
51 namespace gmx
52 {
53
54 std::string Path::join(const std::string &path1,
55                        const std::string &path2)
56 {
57     // TODO: Remove extra separators if they are present in the input paths.
58     return path1 + cDirSeparator + path2;
59 }
60
61
62 std::string Path::join(const std::string &path1,
63                        const std::string &path2,
64                        const std::string &path3)
65 {
66     // TODO: Remove extra separators if they are present in the input paths.
67     return path1 + cDirSeparator + path2 + cDirSeparator + path3;
68 }
69
70
71 int Directory::create(const char *path)
72 {
73     if (Directory::exists(path))
74     {
75         return 0;
76     }
77 #ifdef GMX_NATIVE_WINDOWS
78     if (_mkdir(path))
79 #else
80     if (mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH) != 0)
81 #endif
82     {
83         // TODO: Proper error handling.
84         return -1;
85     }
86     return 0;
87 }
88
89
90 int Directory::create(const std::string &path)
91 {
92     return create(path.c_str());
93 }
94
95
96 bool Directory::exists(const char *path)
97 {
98     struct stat info;
99     if (stat(path, &info) != 0)
100     {
101         if (errno != ENOENT && errno != ENOTDIR)
102         {
103             // TODO: Proper error handling.
104         }
105         return false;
106     }
107 #ifdef GMX_NATIVE_WINDOWS
108     return ((_S_IFDIR & info.st_mode) != 0);
109 #else
110     return S_ISDIR(info.st_mode);
111 #endif
112 }
113
114
115 bool Directory::exists(const std::string &path)
116 {
117     return exists(path.c_str());
118 }
119
120 } // namespace gmx