Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/support/log.h @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anagram/support/log.h Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,118 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * Copyright 2006 David A. Holland. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * log.h - logging + */ + +#ifndef LOG_H +#define LOG_H + +#ifdef VACLGUI +#include <ipoint.hpp> +#include <irect.hpp> +#include <istring.hpp> +#include <iexcbase.hpp> +#endif + +class AgString; // from agstr.h +struct cint; // from cint.h + +#ifdef INCLUDE_LOGGING + +enum LogSwitch { + LOG_OFF, // logging is disabled + LOG_MAYBE, // logging switch inherits from context + LOG_ON, // logging is enabled +}; + +class LogSection { + protected: + LogSection *previous; + const char *name; + LogSwitch saved_switch; + public: + // the name passed in should be a string constant + LogSection(const char *name, LogSwitch requested_setting); + ~LogSection(); + + static void logstack(); +}; + +/* start a nested (sub)section, which lasts until end of scope */ +#define LOGSECTION(name) LogSection myLogSection(name, LOG_MAYBE) +#define LOGSECTION_OFF(name) LogSection myLogSection(name, LOG_OFF) +#define LOGSECTION_ON(name) LogSection myLogSection(name, LOG_ON) + +/* Logging macros. */ + +/* + * LOGV logs a variable, with its name and value. + * LOGS logs a literal string. + */ + +#define LOGV(v) (logeol(), dolog(#v " = "), dolog(v)) +#define LOGS(s) (logeol(), dolog(s)) + +/* The L... forms are for appending after a LOGV/LOGS in the same expression.*/ +#define LV(v) , (dolog(" " #v " = "), dolog(v)) +#define LS(s) , (dolog(" "), dolog(s)) + +/* The LC... forms are the same but insert a comma. */ +#define LCV(v) , (dolog(", " #v " = "), dolog(v)) +#define LCS(s) , (dolog(", "), dolog(s)) + +/* LOGX is for sticking in front of LV/LCV/whatnot to avoid the newline */ +#define LOGX() ((void)0) + +/* Misc. */ +#define LOGINIT() +#define LOGSTACK LogSection::logstack() +#define LOGEXCEPTION(e) logexception(e) + +/* This can be used to enclose bits of expression only used when logging. */ +#define IFLOG(x) x + +/* The underlying functions */ +void logeol(void); +void logtime(void); + +void dolog(const char *); +void dolog(const AgString &); +void dolog(void *); +void dolog(int); +void dolog(cint); + +#ifdef VACLGUI +void logexception(IException &); +void dolog(const IString &s); +void dolog(const IPair &p); +void dolog(const IRectangle &r); +#endif + + +#else + +/* With logging off, nothing exists */ + +#define LOGSECTION(name) +#define LOGSECTION_OFF(name) +#define LOGSECTION_ON(name) +#define LOGV(x) +#define LOGS(x) +#define LV(x) +#define LS(x) +#define LCV(x) +#define LCS(X) +#define LOGX() +#define LOGINIT() +#define LOGSTACK +#define LOGEXCEPTION(e) + +#define IFLOG(x) + +#endif /* INCLUDE_LOGGING */ + +#endif /* LOG_H */