source: trunk/yat/utility/utility.cc @ 2919

Last change on this file since 2919 was 2919, checked in by Peter, 9 years ago

update copyright years

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.9 KB
Line 
1// $Id: utility.cc 2919 2012-12-19 06:54:23Z peter $
2
3/*
4  Copyright (C) 2005, 2006 Jari Häkkinen, Markus Ringnér
5  Copyright (C) 2007, 2008 Jari Häkkinen, Peter Johansson
6  Copyright (C) 2010, 2012 Peter Johansson
7
8  This file is part of the yat library, http://dev.thep.lu.se/yat
9
10  The yat library is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License as
12  published by the Free Software Foundation; either version 3 of the
13  License, or (at your option) any later version.
14
15  The yat library is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with yat. If not, see <http://www.gnu.org/licenses/>.
22*/
23
24#include <config.h>
25
26#include "utility.h"
27
28#include "Exception.h"
29#include "FileUtil.h"
30#include "stl_utility.h"
31
32#include <fnmatch.h>
33#include <fstream>
34#include <sstream>
35#include <string>
36#include <sys/stat.h>
37
38namespace theplu {
39namespace yat {
40namespace utility {
41
42  std::string basename(const std::string& path)
43  {
44    if (path.size()==1)
45      return path;
46    size_t pos = path.find_last_of('/');
47    if (pos==std::string::npos)
48      return path;
49    if (pos==path.size()-1)
50      return basename(path.substr(0, path.size()-1));
51    return path.substr(pos+1);
52  }
53
54
55  void chdir(const std::string& dir)
56  {
57    if (::chdir(dir.c_str()) )
58      throw errno_error("chdir: " + dir + ":");
59  }
60
61
62  void chmod(const std::string& filename, mode_t mode)
63  {
64    if (::chmod(filename.c_str(), mode))
65      throw errno_error("chmod: ");
66  }
67
68
69  void copy_file(const std::string& source, const std::string& target)
70  {
71    std::ifstream is;
72    std::ofstream os;
73
74    is.open(source.c_str(), std::ios::in | std::ios::binary);
75    os.open(target.c_str(), std::ios::out | std::ios::binary);
76    os << is.rdbuf();
77    if (!os.good()) {
78      std::ostringstream ss;
79      ss << "copy_file failed writing to '" << target << "'\n";
80      throw runtime_error(ss.str());
81    }
82    if (is.bad() || is.fail()) {
83      std::ostringstream ss;
84      ss << "copy_file failed reading from '" << source << "'\n";
85      throw runtime_error(ss.str());
86    }
87    is.close();
88    os.close();
89
90    // copy permissions
91    struct stat nodestat;
92    stat(source.c_str(), &nodestat);
93    chmod(target.c_str(), nodestat.st_mode);
94  }
95
96
97  std::string dirname(const std::string& path)
98  {
99    if (path.size()==1) {
100      if (path=="/")
101        return path;
102      else
103        return ".";
104    }
105    assert(path.size()>=2);
106    size_t pos = path.find_last_of('/', path.size()-2);
107    if (pos==std::string::npos)
108      return ".";
109    if (pos==0)
110      return "/";
111    return path.substr(0,pos);
112  }
113
114
115  bool fnmatch(const std::string& pattern, const std::string& str, int flags)
116  {
117    int res = ::fnmatch(pattern.c_str(), str.c_str(), flags);
118    if (res==0)
119      return true;
120    if (res!=FNM_NOMATCH) {
121      std::stringstream ss;
122      ss << "fnmatch(" << pattern << ", " << str << ")";
123      throw runtime_error(ss.str());
124    }
125    return false;
126  }
127
128
129  bool is_double(const std::string& s)
130  {
131    return is<double>(s);
132  }
133 
134
135  bool is_equal(std::string s, std::string other)
136  {
137    std::stringstream ss(s);
138    std::string s2;
139    ss >> s2; // to trim surrounding whitespaces
140    to_lower(s2);
141    if (s2!=other)
142      return false;
143    // Check that nothing is left on stream
144    std::string s3;
145    ss >> s3;
146    return s3.empty();
147  }
148
149
150  bool is_float(const std::string& s)
151  {
152    return is<float>(s);
153  }
154
155
156  bool is_int(const std::string& s)
157  {
158    return is<int>(s);
159  }
160
161  bool is_nan(const std::string& s)
162  {
163    return is_equal(s, "nan");
164  }
165
166
167  void mkdir(const std::string& dir, mode_t mode)
168  {
169    int code = ::mkdir(dir.c_str(), mode);
170    if (code){
171      std::stringstream ss;
172      ss << "mkdir: '" << dir << "': ";
173      throw yat::utility::errno_error(ss.str());
174    }
175  }
176
177
178  void mkdir_p(const std::string& dir, mode_t mode)
179  {
180    if (FileUtil(dir).exists())
181      return;
182    mkdir_p(dirname(dir), mode);
183    mkdir(dir, mode);
184  }
185
186
187}}} // end of namespace utility, yat and thep
Note: See TracBrowser for help on using the repository browser.