1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
#ifdef HAVE_CONFIG_H
# include "../config.h"
#endif // HAVE_CONFIG_H
extern "C" {
#include <X11/Xatom.h>
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif // HAVE_UNISTD_H
#if defined(HAVE_PROCESS_H) && defined(__EMX__)
# include <process.h>
#endif // HAVE_PROCESS_H __EMX__
#include <assert.h>
}
#include <algorithm>
#include "util.hh"
using std::string;
namespace ob {
string expandTilde(const string& s) {
if (s[0] != '~') return s;
const char* const home = getenv("HOME");
if (home == NULL) return s;
return string(home + s.substr(s.find('/')));
}
void bexec(const string& command, const string& displaystring) {
#ifndef __EMX__
if (! fork()) {
setsid();
int ret = putenv(const_cast<char *>(displaystring.c_str()));
assert(ret != -1);
ret = execl("/bin/sh", "/bin/sh", "-c", command.c_str(), NULL);
exit(ret);
}
#else // __EMX__
spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", command.c_str(), NULL);
#endif // !__EMX__
}
string textPropertyToString(Display *display, XTextProperty& text_prop) {
string ret;
if (text_prop.value && text_prop.nitems > 0) {
if (text_prop.encoding == XA_STRING) {
ret = (char *) text_prop.value;
} else {
text_prop.nitems = strlen((char *) text_prop.value);
char **list;
int num;
if (XmbTextPropertyToTextList(display, &text_prop,
&list, &num) == Success &&
num > 0 && *list) {
ret = *list;
XFreeStringList(list);
}
}
}
return ret;
}
timeval normalizeTimeval(const timeval &tm) {
timeval ret = tm;
while (ret.tv_usec < 0) {
if (ret.tv_sec > 0) {
--ret.tv_sec;
ret.tv_usec += 1000000;
} else {
ret.tv_usec = 0;
}
}
if (ret.tv_usec >= 1000000) {
ret.tv_sec += ret.tv_usec / 1000000;
ret.tv_usec %= 1000000;
}
if (ret.tv_sec < 0) ret.tv_sec = 0;
return ret;
}
string itostring(unsigned long i) {
if (i == 0)
return string("0");
string tmp;
for (; i > 0; i /= 10)
tmp.insert(tmp.begin(), "0123456789"[i%10]);
return tmp;
}
string itostring(long i) {
std::string tmp = itostring( (unsigned long) std::abs(i));
if (i < 0)
tmp.insert(tmp.begin(), '-');
return tmp;
}
}
#ifndef HAVE_BASENAME
string basename (const string& path) {
string::size_type slash = path.rfind('/');
if (slash == string::npos)
return path;
return path.substr(slash+1);
}
#endif // HAVE_BASENAME
|