source: branches/0.6-stable/lib/utility.cc @ 456

Last change on this file since 456 was 456, checked in by Jari Häkkinen, 14 years ago

Refs #251.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 5.0 KB
Line 
1// $Id: utility.cc 456 2007-08-21 07:56:06Z jari $
2
3/*
4  Copyright (C) 2006 Jari Häkkinen, Peter Johansson
5  Copyright (C) 2007 Peter Johansson
6
7  This file is part of svndigest, http://trac.thep.lu.se/trac/svndigest
8
9  svndigest is free software; you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation; either version 2 of the License, or
12  (at your option) any later version.
13
14  svndigest is distributed in the hope that it will be useful, but
15  WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22  02111-1307, USA.
23*/
24
25#include "utility.h"
26
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 file_name(const std::string& full_path)
83  {
84    std::stringstream ss(full_path);
85    std::string name;
86    while (getline(ss,name,'/')) {}
87    return name;
88  }
89
90
91  std::string getenv(const std::string& var)
92  {
93    char* buffer=std::getenv(var.c_str());
94    if (!buffer)
95      throw std::runtime_error("Environment variable "+var+" is not set");
96    return std::string(buffer);
97  }
98
99
100  std::string hex(int x, u_int width)
101  {
102    std::stringstream ss;
103    ss << std::hex << x;
104    if (!width)
105      return ss.str();
106    if (ss.str().size()<width) 
107      return std::string(width-ss.str().size(), '0') + ss.str();
108    return ss.str().substr(0, width);
109  }
110
111
112  std::string htrim(std::string str)
113  {
114    size_t length=str.size();
115    while(length && isspace(str[length-1]))
116      --length;
117    return str.substr(0,length);
118  }
119
120
121  bool is_int(std::string s)
122  {
123    std::stringstream ss(s);
124    int a;
125    ss >> a;
126    if(ss.fail()) 
127      return false;
128    // Check that nothing is left on stream
129    std::string b;
130    ss >> b;
131    return b.empty();
132  }
133
134
135  std::string ltrim(std::string str)
136  {
137    size_t i = 0;
138    while(i<str.size() && isspace(str[i]))
139      ++i;
140    return str.substr(i);
141  }
142
143
144  int percent(int a, int b)
145  {
146    if (b)
147      return (100*a)/b;
148    return 0;
149  }
150
151
152  bool node_exist(const std::string& path)
153  {
154    struct stat buf;
155    return !stat(path.c_str(),&buf);
156  }
157
158
159  std::string pwd(void)
160  {
161    char buffer[MAXPATHLEN];
162    if (!getcwd(buffer, MAXPATHLEN))
163      throw std::runtime_error("Failed to get current working directory");
164    return std::string(buffer);
165  }
166
167
168  void touch(std::string str)
169  {
170    if (!node_exist(str)) {
171      std::ofstream os(str.c_str());
172      os.close();
173    }
174  }
175
176  time_t str2time(const std::string& str)
177  {
178    //  str in format 2006-09-09T10:55:52.132733Z
179    std::stringstream sstream(str);
180    time_t rawtime;
181    struct tm * timeinfo;
182    time ( &rawtime );
183    timeinfo =  gmtime ( &rawtime );
184
185    u_int year, month, day, hour, minute, second;
186    std::string tmp;
187    getline(sstream,tmp,'-');
188    year=atoi(tmp.c_str());
189    timeinfo->tm_year = year - 1900;
190
191    getline(sstream,tmp,'-');
192    month=atoi(tmp.c_str());
193    timeinfo->tm_mon = month - 1;
194
195    getline(sstream,tmp,'T');
196    day=atoi(tmp.c_str());
197    timeinfo->tm_mday = day;
198
199    getline(sstream,tmp,':');
200    hour=atoi(tmp.c_str());
201    timeinfo->tm_hour = hour;
202
203    getline(sstream,tmp,':');
204    minute=atoi(tmp.c_str());
205    timeinfo->tm_min = minute;
206
207    getline(sstream,tmp,'.');
208    second=atoi(tmp.c_str());
209    timeinfo->tm_sec = second;
210
211    return mktime(timeinfo);
212  }
213
214
215  std::string match(std::string::const_iterator& first,
216                    const std::string::const_iterator& last,
217                    std::string str)
218  {
219    if (match_begin(first, last, str)){
220      first+=str.size();
221      return str;
222    }
223    return std::string();
224  }
225
226  notChar::notChar(char c)
227    : char_(c)
228  {}
229
230
231  not2Char::not2Char(char c1, char c2)
232    : char1_(c1), char2_(c2)
233  {}
234   
235
236  not2Str::not2Str(std::string s1, std::string s2)
237    : str1_(s1), str2_(s2)
238  {}
239   
240}} // end of namespace svndigest and namespace theplu
Note: See TracBrowser for help on using the repository browser.