source: trunk/lib/utility.cc @ 514

Last change on this file since 514 was 514, checked in by Peter Johansson, 14 years ago

Fixing #230

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 6.3 KB
Line 
1// $Id: utility.cc 514 2007-12-09 01:51:07Z peter $
2
3/*
4  Copyright (C) 2006, 2007 Jari Häkkinen, Peter Johansson
5
6  This file is part of svndigest, http://trac.thep.lu.se/trac/svndigest
7
8  svndigest is free software; you can redistribute it and/or modify it
9  under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12
13  svndigest is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21  02111-1307, USA.
22*/
23
24#include "utility.h"
25
26#include <cerrno> 
27#include <cstdlib>
28#include <fstream>
29#include <sstream>
30#include <stdexcept>
31#include <string>
32#include <sys/param.h>
33#include <unistd.h>
34
35#include <iostream>
36
37namespace theplu{
38namespace svndigest{
39
40  int access_rights(const std::string& path, const std::string& bits)
41  {
42    if (access(path.c_str(),F_OK)) {
43      throw std::runtime_error(std::string("access_rights: ") + path +
44                               "' does not exist.");
45    }
46    int mode=0;
47    for (u_int i=0; i<bits.length(); ++i)
48      switch (bits[i]) {
49          case 'r':
50            mode|=R_OK;
51            break;
52          case 'w':
53            mode|=W_OK;
54            break;
55          case 'x':
56            mode|=X_OK;
57            break;
58      }
59    return access(path.c_str(),mode);
60  }
61
62
63  void copy_file(const std::string& source, const std::string& target)
64  {
65    std::ofstream o(target.c_str());
66    std::ifstream i(source.c_str());
67    while (i.good()) {
68      char ch=i.get();
69      if (i.good())
70        o.put(ch);
71      if (!o.good())
72        throw std::runtime_error(std::string("copy_file: ") +
73                                 "writing target file failed '" + target + "'");
74    }
75    if (!i.eof() && (i.bad() || i.fail()))  // fail on everything except eof
76      throw std::runtime_error(std::string("copy_file: ") +
77                               "error reading source file '" + source + "'");
78    i.close(); o.close();
79  }
80
81
82  std::string directory_name(std::string path)
83  {
84    size_t pos = path.find_last_of("/");
85    if (pos==path.size()-1)
86      return directory_name(path.substr(0,path.size()-2));
87    return path.substr(0,pos+1);
88  }
89
90
91  bool equal(std::string::const_iterator first1, 
92             std::string::const_iterator end1,
93             std::string::const_iterator first2,
94             std::string::const_iterator end2)
95  {
96    if (first1==end1 && first2==end2)
97      return true;
98    if (first1!=end1 && first2!=end2 && 
99        (*first1==*first2 || *first1=='*' || *first2=='*' ||
100         *first1=='?' || *first2=='?') && 
101        equal(first1+1, end1, first2+1, end2) )
102      return true;
103    if (first1!=end1 && *first1=='*' && first2!=end2 && 
104        equal(first1, end1, first2+1, end2) )
105      return true;
106    if (first2!=end2 && *first2=='*' && first1!=end1 && 
107        equal(first1+1, end1, first2, end2) )
108      return true;
109       
110    return false;
111  }
112
113
114  std::string file_name(const std::string& full_path)
115  {
116    std::stringstream ss(full_path);
117    std::string name;
118    while (getline(ss,name,'/')) {}
119    return name;
120  }
121
122
123  std::string getenv(const std::string& var)
124  {
125    char* buffer=std::getenv(var.c_str());
126    if (!buffer)
127      throw std::runtime_error("Environment variable "+var+" is not set");
128    return std::string(buffer);
129  }
130
131
132  std::string hex(int x, u_int width)
133  {
134    std::stringstream ss;
135    ss << std::hex << x;
136    if (!width)
137      return ss.str();
138    if (ss.str().size()<width) 
139      return std::string(width-ss.str().size(), '0') + ss.str();
140    return ss.str().substr(0, width);
141  }
142
143
144  std::string htrim(std::string str)
145  {
146    size_t length=str.size();
147    while(length && isspace(str[length-1]))
148      --length;
149    return str.substr(0,length);
150  }
151
152
153  bool is_int(std::string s)
154  {
155    std::stringstream ss(s);
156    int a;
157    ss >> a;
158    if(ss.fail()) 
159      return false;
160    // Check that nothing is left on stream
161    std::string b;
162    ss >> b;
163    return b.empty();
164  }
165
166
167  std::string ltrim(std::string str)
168  {
169    size_t i = 0;
170    while(i<str.size() && isspace(str[i]))
171      ++i;
172    return str.substr(i);
173  }
174
175  void mkdir(const std::string& dir)
176  { 
177    int code = ::mkdir(dir.c_str(),0777);
178    if (code){
179      std::stringstream ss;
180      ss << "mkdir(" << dir << "): failed with error code: errno=" << errno;
181      throw std::runtime_error(ss.str());
182    }
183  }
184
185
186  bool node_exist(const std::string& path)
187  {
188    struct stat buf;
189    return !stat(path.c_str(),&buf);
190  }
191
192
193  int percent(int a, int b)
194  {
195    if (b)
196      return (100*a)/b;
197    return 0;
198  }
199
200
201  std::string pwd(void)
202  {
203    char buffer[MAXPATHLEN];
204    if (!getcwd(buffer, MAXPATHLEN))
205      throw std::runtime_error("Failed to get current working directory");
206    return std::string(buffer);
207  }
208
209
210  void replace(std::string& str, std::string old_str, std::string new_str)
211  {
212    std::string::iterator iter(str.begin());
213    while ((iter=search(iter, str.end(), old_str)) != str.end()) {
214      size_t i = iter-str.begin();
215      str = std::string(str.begin(), iter) + new_str + 
216        std::string(iter+old_str.size(), str.end());
217      // pointing to char after substr we just inserted
218      iter = str.begin() + (i+new_str.size()); 
219    }
220  }
221
222
223  void touch(std::string str)
224  {
225    if (!node_exist(str)) {
226      std::ofstream os(str.c_str());
227      os.close();
228    }
229  }
230
231  time_t str2time(const std::string& str)
232  {
233    //  str in format 2006-09-09T10:55:52.132733Z
234    std::stringstream sstream(str);
235    time_t rawtime;
236    struct tm * timeinfo;
237    time ( &rawtime );
238    timeinfo =  gmtime ( &rawtime );
239
240    u_int year, month, day, hour, minute, second;
241    std::string tmp;
242    getline(sstream,tmp,'-');
243    year=atoi(tmp.c_str());
244    timeinfo->tm_year = year - 1900;
245
246    getline(sstream,tmp,'-');
247    month=atoi(tmp.c_str());
248    timeinfo->tm_mon = month - 1;
249
250    getline(sstream,tmp,'T');
251    day=atoi(tmp.c_str());
252    timeinfo->tm_mday = day;
253
254    getline(sstream,tmp,':');
255    hour=atoi(tmp.c_str());
256    timeinfo->tm_hour = hour;
257
258    getline(sstream,tmp,':');
259    minute=atoi(tmp.c_str());
260    timeinfo->tm_min = minute;
261
262    getline(sstream,tmp,'.');
263    second=atoi(tmp.c_str());
264    timeinfo->tm_sec = second;
265
266    return mktime(timeinfo);
267  }
268
269
270  std::string match(std::string::const_iterator& first,
271                    const std::string::const_iterator& last,
272                    std::string str)
273  {
274    if (match_begin(first, last, str)){
275      first+=str.size();
276      return str;
277    }
278    return std::string();
279  }
280
281}} // end of namespace svndigest and namespace theplu
Note: See TracBrowser for help on using the repository browser.