46#include <boost/uuid/detail/sha1.hpp>
57 using namespace boost;
62 typedef posix_time::ptime
ptime;
64 typedef gregorian::date
date;
68 typedef boost::filesystem::path
path;
89 const string& file, std::size_t line);
93 ((x) ? ((void)0) : debug_assert(#x, BOOST_CURRENT_FUNCTION, \
98#define assert(x) ((void)(x))
113extern bool verify_enabled;
115#define VERIFY(x) if (ledger::verify_enabled) { assert(x); }
116#define DO_VERIFY() ledger::verify_enabled
118void initialize_memory_tracing();
119void shutdown_memory_tracing();
121std::size_t current_memory_size();
122std::size_t current_objects_size();
124void trace_ctor_func(
void * ptr,
const char * cls_name,
const char * args,
125 std::size_t cls_size);
126void trace_dtor_func(
void * ptr,
const char * cls_name, std::size_t cls_size);
128#define TRACE_CTOR(cls, args) \
130 ledger::trace_ctor_func(this, #cls, args, sizeof(cls)) : ((void)0))
131#define TRACE_DTOR(cls) \
133 ledger::trace_dtor_func(this, #cls, sizeof(cls)) : ((void)0))
135void report_memory(std::ostream& out,
bool report_all =
false);
142#define DO_VERIFY() false
143#define TRACE_CTOR(cls, args)
144#define TRACE_DTOR(cls)
148#define IF_VERIFY() if (DO_VERIFY())
169 std::ostringstream buf;
175 std::ostringstream buf;
186inline string operator+(
const char * left,
const string& right) {
187 return string(left) + right;
223 static const char * const _this_category = cat
227extern uint16_t _trace_level;
229#define SHOW_TRACE(lvl) \
230 (ledger::_log_level >= ledger::LOG_TRACE && lvl <= ledger::_trace_level)
231#define TRACE(lvl, msg) \
233 ((ledger::_log_buffer << msg), \
234 ledger::logger_func(ledger::LOG_TRACE)) : (void)0)
238#define SHOW_TRACE(lvl) false
239#define TRACE(lvl, msg)
245extern optional<std::string> _log_category;
246#if HAVE_BOOST_REGEX_UNICODE
247 extern optional<boost::u32regex> _log_category_re;
249 extern optional<boost::regex> _log_category_re;
252inline bool category_matches(
const char * cat) {
254 if (! _log_category_re) {
256#if HAVE_BOOST_REGEX_UNICODE
257 boost::make_u32regex(_log_category->c_str(),
258 boost::regex::perl | boost::regex::icase);
260 boost::regex(_log_category->c_str(),
261 boost::regex::perl | boost::regex::icase);
264#if HAVE_BOOST_REGEX_UNICODE
265 return boost::u32regex_search(cat, *_log_category_re);
267 return boost::regex_search(cat, *_log_category_re);
273#define SHOW_DEBUG(cat) \
274 (ledger::_log_level >= ledger::LOG_DEBUG && ledger::category_matches(cat))
275#define SHOW_DEBUG_() SHOW_DEBUG(_this_category)
277#define DEBUG(cat, msg) \
279 ((ledger::_log_buffer << msg), \
280 ledger::logger_func(ledger::LOG_DEBUG)) : (void)0)
281#define DEBUG_(msg) DEBUG(_this_category, msg)
285#define SHOW_DEBUG(cat) false
286#define SHOW_DEBUG_() false
287#define DEBUG(cat, msg)
292#define LOG_MACRO(level, msg) \
293 (ledger::_log_level >= level ? \
294 ((ledger::_log_buffer << msg), ledger::logger_func(level)) : (void)0)
296#define SHOW_INFO() (ledger::_log_level >= ledger::LOG_INFO)
297#define SHOW_WARN() (ledger::_log_level >= ledger::LOG_WARN)
298#define SHOW_ERROR() (ledger::_log_level >= ledger::LOG_ERROR)
299#define SHOW_FATAL() (ledger::_log_level >= ledger::LOG_FATAL)
300#define SHOW_CRITICAL() (ledger::_log_level >= ledger::LOG_CRIT)
302#define INFO(msg) LOG_MACRO(ledger::LOG_INFO, msg)
303#define WARN(msg) LOG_MACRO(ledger::LOG_WARN, msg)
304#define ERROR(msg) LOG_MACRO(ledger::LOG_ERROR, msg)
305#define FATAL(msg) LOG_MACRO(ledger::LOG_FATAL, msg)
306#define CRITICAL(msg) LOG_MACRO(ledger::LOG_CRIT, msg)
307#define EXCEPTION(msg) LOG_MACRO(ledger::LOG_EXCEPT, msg)
311#define IF_TRACE(lvl) if (SHOW_TRACE(lvl))
312#define IF_DEBUG(cat) if (SHOW_DEBUG(cat))
313#define IF_DEBUG_() if (SHOW_DEBUG_())
314#define IF_INFO() if (SHOW_INFO())
315#define IF_WARN() if (SHOW_WARN())
316#define IF_ERROR() if (SHOW_ERROR())
317#define IF_FATAL() if (SHOW_FATAL())
318#define IF_CRITICAL() if (SHOW_CRITICAL())
337#define TRACE_START(name, lvl, msg) \
339 ((ledger::_log_buffer << msg), \
340 ledger::start_timer(#name, ledger::LOG_TRACE)) : ((void)0))
341#define TRACE_STOP(name, lvl) \
342 (SHOW_TRACE(lvl) ? ledger::stop_timer(#name) : ((void)0))
343#define TRACE_FINISH(name, lvl) \
344 (SHOW_TRACE(lvl) ? ledger::finish_timer(#name) : ((void)0))
346#define TRACE_START(name, lvl, msg)
347#define TRACE_STOP(name, lvl)
348#define TRACE_FINISH(name, lvl)
352#define DEBUG_START(name, cat, msg) \
354 ((ledger::_log_buffer << msg), \
355 ledger::start_timer(#name, ledger::LOG_DEBUG)) : ((void)0))
356#define DEBUG_START_(name, msg) \
357 DEBUG_START_(name, _this_category, msg)
358#define DEBUG_STOP(name, cat) \
359 (SHOW_DEBUG(cat) ? ledger::stop_timer(#name) : ((void)0))
360#define DEBUG_STOP_(name) \
361 DEBUG_STOP_(name, _this_category)
362#define DEBUG_FINISH(name, cat) \
363 (SHOW_DEBUG(cat) ? ledger::finish_timer(#name) : ((void)0))
364#define DEBUG_FINISH_(name) \
365 DEBUG_FINISH_(name, _this_category)
367#define DEBUG_START(name, cat, msg)
368#define DEBUG_START_(name, msg)
369#define DEBUG_STOP(name)
370#define DEBUG_FINISH(name)
373#define INFO_START(name, msg) \
375 ((ledger::_log_buffer << msg), \
376 ledger::start_timer(#name, ledger::LOG_INFO)) : ((void)0))
377#define INFO_STOP(name) \
378 (SHOW_INFO() ? stop_timer(#name) : ((void)0))
379#define INFO_FINISH(name) \
380 (SHOW_INFO() ? finish_timer(#name) : ((void)0))
386#define TRACE_START(lvl, msg, name)
387#define TRACE_STOP(name, lvl)
388#define TRACE_FINISH(name, lvl)
390#define DEBUG_START(name, msg)
391#define DEBUG_START_(name, cat, msg)
392#define DEBUG_STOP(name)
393#define DEBUG_FINISH(name)
395#define INFO_START(name, msg)
396#define INFO_STOP(name)
397#define INFO_FINISH(name)
425 throw std::runtime_error(_(
"Interrupted by user (use Control-D to quit)"));
427 throw std::runtime_error(_(
"Pipe terminated"));
436#define foreach BOOST_FOREACH
437using std::unique_ptr;
441template <
typename T,
typename U>
443 return *polymorphic_downcast<T *>(&
object);
449 const string& second) {
450 return first.empty() ? second : first;
454 while (*ptr ==
' ' || *ptr ==
'\t' || *ptr ==
'\n')
460 std::size_t len = std::strlen(ptr);
461 int i = int(len) - 1;
462 while (i >= 0 && (ptr[i] ==
' ' || ptr[i] ==
'\t' || ptr[i] ==
'\n'))
468 for (
char * p = buf; *p; p++) {
469 if (! (*p ==
' ' || *p ==
'\t'))
476 else if (*p ==
'\t') {
480 else if (*(p + 1) ==
' ') {
490 while (in.good() && ! in.eof() && std::isspace(c)) {
497#define READ_INTO(str, targ, size, var, cond) { \
500 while (str.good() && ! str.eof() && var != '\n' && \
501 (cond) && _p - targ < size) { \
510 case 'b': var = '\b'; break; \
511 case 'f': var = '\f'; break; \
512 case 'n': var = '\n'; break; \
513 case 'r': var = '\r'; break; \
514 case 't': var = '\t'; break; \
515 case 'v': var = '\v'; break; \
525#define READ_INTO_(str, targ, size, var, idx, cond) { \
528 while (str.good() && ! str.eof() && var != '\n' && \
529 (cond) && _p - targ < size) { \
539 case 'b': var = '\b'; break; \
540 case 'f': var = '\f'; break; \
541 case 'n': var = '\n'; break; \
542 case 'r': var = '\r'; break; \
543 case 't': var = '\t'; break; \
544 case 'v': var = '\v'; break; \
556 const boost::uuids::detail::sha1::digest_type& message_digest,
557 size_t len =
sizeof(boost::uuids::detail::sha1::digest_type) * 2
559 std::ostringstream buf;
560 buf.setf(std::ios_base::hex, std::ios_base::basefield);
564 const size_t count = std::min(
565 sizeof(message_digest) /
sizeof(message_digest[0]),
566 (len - 1) / (
sizeof(message_digest[0]) * 2) + 1
568 for(
size_t i = 0; i < count; i++) {
569 buf.width(
sizeof(message_digest[i]) * 2);
570 buf << (
unsigned int)message_digest[i];
572 string hex = buf.str();
573 hex.resize(len,
'0');
579 size_t len =
sizeof(boost::uuids::detail::sha1::digest_type) * 2
581 static boost::uuids::detail::sha1 sha;
582 boost::uuids::detail::sha1::digest_type message_digest;
585 sha.process_bytes(str.c_str(), str.length());
586 sha.get_digest(message_digest);
void sigint_handler(int sig)
void sigpipe_handler(int sig)
caught_signal_t caught_signal
boost::filesystem::ifstream ifstream
boost::filesystem::ofstream ofstream
string operator+(const char *left, const string &right)
string lowered(const string &str)
void logger_func(log_level_t level)
std::ostringstream _log_buffer
const string & either_or(const string &first, const string &second)
void start_timer(const char *name, log_level_t lvl)
ptime::time_duration_type time_duration
boost::filesystem::filesystem_error filesystem_error
gregorian::date_duration date_duration
string sha1sum(const string &str, size_t len=sizeof(boost::uuids::detail::sha1::digest_type) *2)
void finish_timer(const char *name)
char * next_element(char *buf, bool variable=false)
string to_string(long num)
void stop_timer(const char *name)
std::ostream * _log_stream
boost::filesystem::path path
char * trim_ws(char *ptr)
int peek_next_nonws(std::istream &in)
void debug_assert(const string &reason, const string &func, const string &file, std::size_t line)
std::list< string > strings_list
posix_time::seconds seconds
string digest_to_hex(const boost::uuids::detail::sha1::digest_type &message_digest, size_t len=sizeof(boost::uuids::detail::sha1::digest_type) *2)
path resolve_path(const path &pathname)
strings_list split_arguments(const char *line)
char * skip_ws(char *ptr)