forest-net
an overlay networks for large-scale virtual worlds
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator
Misc.cpp
Go to the documentation of this file.
1 
9 #include "Misc.h"
10 
11 namespace forest {
12 
18 char Misc::cflush(istream& in, char c) {
19  char c1;
20  while (1) {
21  in.get(c1);
22  if (in.eof()) return 0;
23  if (c1 == c) return c;
24  }
25 }
26 
32 char Misc::rflush(istream& in, char c) {
33  char c1;
34  while (1) {
35  in.get(c1);
36  if (in.eof()) return 0;
37  if (c1 != c) return c1;
38  }
39 }
40 
46 bool Misc::readNode(istream& in, int& u, int n) {
47  char c;
48  if (n <= 26) {
49  if ((c = rflush(in,' ')) == 0) return false;
50  u = num(c);
51  } else {
52  if (!(in >> u)) return false;
53  }
54  return true;
55 }
56 
57 void Misc::writeNode(ostream& os, int u, int n) {
58  if (n <= 26) {
59  if (u != Null) os << nam(u);
60  else os << "-";
61  } else {
62  os << setw(2) << u;
63  }
64 }
65 
67 bool Misc::prefix(string s1, string s2) {
68  return s1.length() > 0 && s2.find(s1) == 0;
69 }
70 
77 bool Misc::readAlpha(istream& in, int& x) {
78  char c1;
79  while (1) {
80  in.get(c1); if (!in.good()) return false;
81  if (c1 == '\n') { in.putback(c1); return false; }
82  if (isspace(c1)) continue;
83  if (!islower(c1)) return false;
84  x = num(c1);
85  return true;
86  }
87 }
88 
93 void Misc::writeAlpha(ostream& out, int x) {
94  assert(0 <= x && x <= 26);
95  if (x == 0) out << "Null";
96  else out << nam(x);
97 }
98 
104 bool Misc::readWord(istream& in, string& s) {
105  char c; bool inword;
106  s = ""; inword = false;
107  while (1) {
108  in.get(c); if (!in.good()) return false;
109  if (c == '\n') { in.putback(c); return inword; }
110  if (isspace(c)) {
111  if (inword) { in.putback(c); return true; }
112  else continue;
113  }
114  if (!isalpha(c) && !isdigit(c) && c != '_' && c != '/' && c != '@' && c != '.') {
115  in.putback(c); return inword;
116  }
117  s += c; inword = true;
118  }
119 }
120 
126 bool Misc::readName(istream& in, string& s) {
127  char c; bool inword;
128  s = ""; inword = false;
129  while (1) {
130  in.get(c); if (!in.good()) return false;
131  if (c == '\n') { in.putback(c); return inword; }
132  if (isspace(c)) {
133  if (inword) { in.putback(c); return true; }
134  else continue;
135  }
136  if (!isalpha(c) && !isdigit(c) && c != '_') {
137  in.putback(c); return inword;
138  }
139  if (!inword && !isalpha(c)) {
140  in.putback(c); return false;
141  }
142  s += c; inword = true;
143  }
144 }
145 
152 bool Misc::readString(istream& in, string& s) {
153  char c; bool instring = false;
154  s = "";
155  while (true) {
156  in.get(c); if (!in.good()) return false;
157  if (c == '\"') {
158  if (instring) return true;
159  instring = true;
160  } else if (instring) {
161  s += c;
162  }
163  }
164 }
165 
169 bool Misc::readNum(istream& in, int& i) {
170  char c; long long j;
171  while (1) {
172  in.get(c); if (!in.good()) return false;
173  if (c == '\n') { in.putback(c); return false; }
174  if (isspace(c)) continue;
175  if (!isdigit(c) && c != '-') return false;
176  in.putback(c);
177  if (in >> j) { i = j; return true; }
178  else return false;
179  }
180 }
181 
185 bool Misc::readNum(istream& in, uint32_t& i) {
186  char c;
187  while (1) {
188  in.get(c); if (!in.good()) return false;
189  if (c == '\n') { in.putback(c); return false; }
190  if (isspace(c)) continue;
191  if (!isdigit(c)) return false;
192  in.putback(c);
193  if (in >> i) return true;
194  else return false;
195  }
196 }
197 
198 bool Misc::readNum(istream& in, uint16_t& i) {
199  uint32_t j;
200  if (readNum(in,j)) { i = j; return true; }
201  return false;
202 }
203 
204 bool Misc::readNum(istream& in, char& i) {
205  uint32_t j;
206  if (readNum(in,j)) { i = j; return true; }
207  return false;
208 }
209 
215 bool Misc::skipBlank(istream& in) {
216  char c; bool com;
217  com = false;
218  while (1) {
219  in.get(c); if (!in.good()) return false;
220  if (c == '#') {com = true; continue; }
221  if (c == '\n') {com = false; continue; }
222  if (com || isspace(c)) continue;
223  in.putback(c); return true;
224  }
225 }
226 
230 bool Misc::verify(istream& in, char c) {
231  char c1;
232  while ( true) {
233  in.get(c1); if (!in.good()) return false;
234  if (c1 == c) return true;
235  else if (c1 == '\n' || !isspace(c1))
236  break;
237  }
238  in.putback(c1);
239  return false;
240 }
241 
244 void Misc::genPerm(int n, int p[]) {
245  int i, j, k;
246  for (i = 1; i <= n; i++) p[i] = i;
247  for (i = 1; i <= n; i++) {
248  j = randint(i,n);
249  k = p[i]; p[i] = p[j]; p[j] = k;
250  }
251 }
252 
255 int Misc::strnlen(char* s, int n) {
256  for (int i = 0; i < n; i++)
257  if (*s++ == '\0') return i;
258  return n;
259 }
260 
263  struct timeval now;
264  if (gettimeofday(&now, NULL) < 0)
265  fatal("Misc::getTime: gettimeofday failure");
266  return now.tv_sec;
267 }
268 
274 uint32_t Misc::getTime() {
275  // note use of static variables
276  static uint32_t now;
277  static struct timeval prevTimeval = { 0, 0 };
278 
279  if (prevTimeval.tv_sec == 0 && prevTimeval.tv_usec == 0) {
280  // first call to getTime(); initialize and return 0
281  if (gettimeofday(&prevTimeval, NULL) < 0)
282  fatal("Misc::getTime: gettimeofday failure");
283  now = 0;
284  return 0;
285  }
286  // normal case
287  struct timeval nowTimeval;
288  if (gettimeofday(&nowTimeval, NULL) < 0)
289  fatal("Misc::getTime: gettimeofday failure");
290  uint32_t dsec = nowTimeval.tv_sec; dsec -= prevTimeval.tv_sec;
291  uint32_t dusec = nowTimeval.tv_usec - prevTimeval.tv_usec;
292  if (nowTimeval.tv_usec < prevTimeval.tv_usec) {
293  dusec = nowTimeval.tv_usec + (1000000 - prevTimeval.tv_usec);
294  dsec--;
295  }
296  now += 1000000*dsec + dusec;
297  prevTimeval = nowTimeval;
298 
299  return now;
300 }
301 
310 uint64_t Misc::getTimeNs() {
311  // note use of static variables
312  static uint64_t now;
313  static struct timeval prevTimeval = { 0, 0 };
314 
315  if (prevTimeval.tv_sec == 0 && prevTimeval.tv_usec == 0) {
316  // first call to getTime(); initialize and return 0
317  if (gettimeofday(&prevTimeval, NULL) < 0)
318  fatal("Misc::getTime: gettimeofday failure");
319  now = 0;
320  return 0;
321  }
322  // normal case
323  struct timeval nowTimeval;
324  if (gettimeofday(&nowTimeval, NULL) < 0)
325  fatal("Misc::getTime: gettimeofday failure");
326  time_t dsec = nowTimeval.tv_sec - prevTimeval.tv_sec;
327  suseconds_t dusec = nowTimeval.tv_usec - prevTimeval.tv_usec;
328  if (nowTimeval.tv_usec < prevTimeval.tv_usec) {
329  dusec = nowTimeval.tv_usec + (1000000 - prevTimeval.tv_usec);
330  dsec--;
331  }
332  prevTimeval = nowTimeval;
333  uint64_t diff = dsec; diff *= 1000000; diff += dusec; diff *= 1000;
334  now += diff;
335 
336  return now;
337 }
338 
339 } // ends namespace
340