Bridge++  Version 1.5.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bridgeIO.cpp
Go to the documentation of this file.
1 
14 #include "bridgeIO.h"
17 
18 //====================================================================
19 // verbose output for c style
20 // default verbose level, node 0
21 
22 namespace Bridge {
23  //====================================================================
24  const std::string BridgeIO::class_name = "BridgeIO";
25 
26  //====================================================================
27  BridgeIO::BridgeIO(const std::string& filename)
28  {
29  os_ = NULL;
30 
31 #ifdef ENABLE_ILDG_TAG
32  ildg_os_ = NULL;
33 #endif
34 
35  init(filename);
36 
37 #ifdef ENABLE_ILDG_TAG
38  ildg_init(filename);
39 #endif
40  }
41 
42 
43  //====================================================================
45  {
46  tidyup_();
47  }
48 
49 
50  //====================================================================
51  void BridgeIO::init(const std::string& filename)
52  {
53  if (os_) {
54  stack_.push(os_);
55  }
56 
57  if (filename == "stdout") {
58  os_ = new std::ostream(std::cout.rdbuf());
59  } else {
60  os_ = new std::ofstream(filename.c_str());
61  }
62 
63  if (!os_) {
64  fprintf(stderr, "%s: init: unable to open log file \"%s\".\n", class_name.c_str(), filename.c_str());
65  exit(EXIT_FAILURE);
66 
67  rewind_();
68  }
69  }
70 
71 
72  //====================================================================
73  void BridgeIO::init(const std::ostream& ost)
74  {
75  if (os_) {
76  stack_.push(os_);
77  }
78 
79  os_ = new std::ostream(ost.rdbuf());
80 
81  if (!os_) {
82  fprintf(stderr, "%s: init: unable to open stream.\n", class_name.c_str());
83  exit(EXIT_FAILURE);
84 
85  rewind_();
86  }
87  }
88 
89 
90  //====================================================================
92  {
93  if (os_) delete os_;
94 
95  rewind_();
96  }
97 
98 
99  //====================================================================
101  {
102  if (stack_.size() > 0) {
103  os_ = stack_.top();
104  stack_.pop();
105  } else {
106  os_ = NULL;
107  }
108  }
109 
110 
111  //====================================================================
113  {
114  if (os_) delete os_;
115 
116  while (stack_.size() > 0)
117  {
118  std::ostream *otmp = stack_.top();
119  if (otmp) delete otmp;
120  stack_.pop();
121  }
122 
123 #ifdef ENABLE_ILDG_TAG
124  if (ildg_os_) delete ildg_os_;
125 #endif
126  }
127 
128 
129  //====================================================================
131  BridgeIO::set_verbose_level(const std::string& str)
132  {
134 
135  if ((str == "Crucial") || (str == "crucial") || (str == "CRUCIAL")) return Bridge::CRUCIAL;
136 
137  if ((str == "General") || (str == "general") || (str == "GENERAL")) return Bridge::GENERAL;
138 
139  if ((str == "Detailed") || (str == "detailed") || (str == "DETAILED")) return Bridge::DETAILED;
140 
141  if ((str == "Paranoiac") || (str == "paranoiac") || (str == "PARANOIAC")) return Bridge::PARANOIAC;
142 
143  if ((str == "NULL") || (str == "null")) return CommonParameters::Vlevel();
144 
145  // safe default
146  return Bridge::GENERAL;
147  }
148 
149 
150  //====================================================================
151  std::string
153  {
155 
156  switch (vl)
157  {
158  case Bridge::CRUCIAL:
159  return "Crucial";
160 
161  case Bridge::GENERAL:
162  return "General";
163 
164  case Bridge::DETAILED:
165  return "Detailed";
166 
167  case Bridge::PARANOIAC:
168  return "Paranoiac";
169 
170  default:
171  return "NULL";
172  }
173  }
174 
175 
176  //====================================================================
177  void
178  BridgeIO::crucial(const char *format, ...)
179  {
181 
182  if (vl < Bridge::CRUCIAL) return;
183 
184  va_list arg;
185 
187  if (ith == 0) {
188  va_start(arg, format);
189  print(vl, Bridge::CRUCIAL, 0, format, arg);
190  va_end(arg);
191  }
192  }
193 
194 
195  //====================================================================
196  void
197  BridgeIO::general(const char *format, ...)
198  {
200 
201  if (vl < Bridge::GENERAL) return;
202 
203  va_list arg;
204 
206  if (ith == 0) {
207  va_start(arg, format);
208  print(vl, Bridge::GENERAL, 0, format, arg);
209  va_end(arg);
210  }
211  }
212 
213 
214  //====================================================================
215  void
216  BridgeIO::detailed(const char *format, ...)
217  {
219 
220  if (vl < Bridge::DETAILED) return;
221 
222  va_list arg;
223 
225  if (ith == 0) {
226  va_start(arg, format);
227  print(vl, Bridge::DETAILED, 0, format, arg);
228  va_end(arg);
229  }
230  }
231 
232 
233  //====================================================================
234  void
235  BridgeIO::paranoiac(const char *format, ...)
236  {
238 
239  if (vl < Bridge::PARANOIAC) return;
240 
241  va_list arg;
242 
244  if (ith == 0) {
245  va_start(arg, format);
246  print(vl, Bridge::PARANOIAC, 0, format, arg);
247  va_end(arg);
248  }
249  }
250 
251 
252  //====================================================================
253  // input verbose level, node 0
254  void
255  BridgeIO::crucial(VerboseLevel vl, const char *format, ...)
256  {
257  if (vl < Bridge::CRUCIAL) return;
258 
259  va_list arg;
260 
262  if (ith == 0) {
263  va_start(arg, format);
264  print(vl, Bridge::CRUCIAL, 0, format, arg);
265  va_end(arg);
266  }
267  }
268 
269 
270  //====================================================================
271  void
272  BridgeIO::general(VerboseLevel vl, const char *format, ...)
273  {
274  if (vl < Bridge::GENERAL) return;
275 
276  va_list arg;
277 
279  if (ith == 0) {
280  va_start(arg, format);
281  print(vl, Bridge::GENERAL, 0, format, arg);
282  va_end(arg);
283  }
284  }
285 
286 
287  //====================================================================
288  void
289  BridgeIO::detailed(VerboseLevel vl, const char *format, ...)
290  {
291  if (vl < Bridge::DETAILED) return;
292 
293  va_list arg;
294 
296  if (ith == 0) {
297  va_start(arg, format);
298  print(vl, Bridge::DETAILED, 0, format, arg);
299  va_end(arg);
300  }
301  }
302 
303 
304  //====================================================================
305  void
306  BridgeIO::paranoiac(VerboseLevel vl, const char *format, ...)
307  {
308  if (vl < Bridge::PARANOIAC) return;
309 
310  va_list arg;
311 
313  if (ith == 0) {
314  va_start(arg, format);
315  print(vl, Bridge::PARANOIAC, 0, format, arg);
316  va_end(arg);
317  }
318  }
319 
320 
321  //====================================================================
322  // input verbose level, input node
323  void
324  BridgeIO::crucial(VerboseLevel vl, int node, const char *format, ...)
325  {
326  if (vl < Bridge::CRUCIAL) return;
327 
328  va_list arg;
329 
331  if (ith == 0) {
332  va_start(arg, format);
333  print(vl, Bridge::CRUCIAL, node, format, arg);
334  va_end(arg);
335  }
336  }
337 
338 
339  //====================================================================
340  void
341  BridgeIO::general(VerboseLevel vl, int node, const char *format, ...)
342  {
343  if (vl < Bridge::GENERAL) return;
344 
345  va_list arg;
346 
348  if (ith == 0) {
349  va_start(arg, format);
350  print(vl, Bridge::GENERAL, node, format, arg);
351  va_end(arg);
352  }
353  }
354 
355 
356  //====================================================================
357  void
358  BridgeIO::detailed(VerboseLevel vl, int node, const char *format, ...)
359  {
360  if (vl < Bridge::DETAILED) return;
361 
362  va_list arg;
363 
365  if (ith == 0) {
366  va_start(arg, format);
367  print(vl, Bridge::DETAILED, node, format, arg);
368  va_end(arg);
369  }
370  }
371 
372 
373  //====================================================================
374  void
375  BridgeIO::paranoiac(VerboseLevel vl, int node, const char *format, ...)
376  {
377  if (vl < Bridge::PARANOIAC) return;
378 
379  va_list arg;
380 
382  if (ith == 0) {
383  va_start(arg, format);
384  print(vl, Bridge::PARANOIAC, node, format, arg);
385  va_end(arg);
386  }
387  }
388 
389 
390  //====================================================================
391  std::ostream& BridgeIO::getStream()
392  {
393  return *os_;
394  }
395 
396 
397  //====================================================================
399  {
400  return os_ && *os_;
401  }
402 
403 
404  //====================================================================
405  inline
406  void
408  int node, const char *format, va_list& arg)
409  {
410  if ((write_level <= level) && (Communicator::nodeid() == node)) {
411  if (!os_) {
412  std::cerr << "ERROR: BridgeIO: no output stream." << std::endl;
413  exit(EXIT_FAILURE);
414  }
415 
416  vsprintf(buff_, format, arg);
417 
418  *os_ << buff_;
419 #ifdef DEBUG
420  *os_ << std::flush;
421 #endif
422 
423  if (!os_->good()) {
424  std::cerr << "ERROR: BridgeIO: output failed." << std::endl;
425  exit(EXIT_FAILURE);
426  }
427  }
428  }
429 
430 
431 #ifdef ENABLE_ILDG_TAG
432  //====================================================================
433  void
434  BridgeIO::ildg_init(const std::ostream& ost)
435  {
436  if (ildg_os_) delete ildg_os_;
437  ildg_os_ = new std::ostream(ost.rdbuf());
438 
439  if (!ildg_os_) {
440  fprintf(stderr, "%s: init: unable to ildg open stream.\n", class_name.c_str());
441  exit(EXIT_FAILURE);
442  }
443  }
444 
445 
446  //====================================================================
447  void
448  BridgeIO::ildg_init(const std::string& filename)
449  {
450  if (ildg_os_) delete ildg_os_;
451 
452  if (filename == "stdout") {
453  ildg_os_ = new std::ostream(std::cout.rdbuf());
454  } else {
455  ildg_os_ = new std::ofstream(filename.c_str());
456  }
457 
458  if (!ildg_os_) {
459  fprintf(stderr, "%s: init: unable to open ildg log file \"%s\".\n", class_name.c_str(), filename.c_str());
460  exit(EXIT_FAILURE);
461  }
462  }
463 
464 
465  //====================================================================
466  void
467  BridgeIO::ildg(const char *format, ...)
468  {
469  if (!ildg_os_) {
470  std::cerr << "ERROR: BridgeIO: no ildg output stream." << std::endl;
471  exit(EXIT_FAILURE);
472  }
473 
474  va_list arg;
475 
476  va_start(arg, format);
477  vsprintf(buff_, format, arg);
478  va_end(arg);
479 
480  *ildg_os_ << "@ILDG:" << buff_;
481 #ifdef DEBUG
482  *ildg_os_ << std::flush;
483 #endif
484 
485  if (!ildg_os_->good()) {
486  std::cerr << "ERROR: BridgeIO: ildg output failed." << std::endl;
487  exit(EXIT_FAILURE);
488  }
489  }
490 
491 
492  //====================================================================
493  std::ostream&
495  {
496  return *ildg_os_;
497  }
498 #endif
499  //====================================================================
500 
501 
502  //====================================================================
504 }
505 
506 //====================================================================
507 //====================================================================
BridgeIO vout
Definition: bridgeIO.cpp:503
void detailed(const char *format,...)
Definition: bridgeIO.cpp:216
void general(const char *format,...)
Definition: bridgeIO.cpp:197
virtual ~BridgeIO()
Definition: bridgeIO.cpp:44
static Bridge::VerboseLevel Vlevel()
std::ostream * ildg_os_
Definition: bridgeIO.h:129
void ildg_init(const std::ostream &os)
Definition: bridgeIO.cpp:434
void init(const std::string &filename)
Definition: bridgeIO.cpp:51
static int get_thread_id()
returns thread id.
std::stack< std::ostream * > stack_
Definition: bridgeIO.h:123
void ildg(const char *format,...)
Definition: bridgeIO.cpp:467
BridgeIO(const std::string &filename="stdout")
Definition: bridgeIO.cpp:27
void paranoiac(const char *format,...)
Definition: bridgeIO.cpp:235
void crucial(const char *format,...)
Definition: bridgeIO.cpp:178
Bridge::VerboseLevel vl
VerboseLevel
Definition: bridgeIO.h:42
std::ostream & getStream()
Definition: bridgeIO.cpp:391
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:152
void print(VerboseLevel level, VerboseLevel write_level, int node, const char *format, va_list &arg)
Definition: bridgeIO.cpp:407
static const std::string class_name
Definition: bridgeIO.h:52
char buff_[1024]
Definition: bridgeIO.h:126
static int nodeid()
alternative name for self().
Definition: communicator.h:105
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
std::ostream * os_
Definition: bridgeIO.h:120
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:131
std::ostream & getILDGStream()
Definition: bridgeIO.cpp:494