aboutsummaryrefslogtreecommitdiffstats
path: root/trace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trace.cpp')
-rw-r--r--trace.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/trace.cpp b/trace.cpp
new file mode 100644
index 0000000..f5b50cc
--- /dev/null
+++ b/trace.cpp
@@ -0,0 +1,176 @@
+// trace.cpp
+// Revision 7-feb-2005
+
+#include "trace.h"
+
+
+#if __BORLANDC__ >= 0x0560
+#pragma warn -8091
+#endif
+
+#include <iostream>
+#include <fstream>
+#include <string>
+
+#ifdef HAVE_CSTDLIB
+#include <cstdlib>
+#else
+#include <stdlib.h>
+#endif
+
+#include <stdexcept>
+
+#include <string.h>
+
+using std::cerr;
+using std::endl;
+using std::ostream;
+using std::ofstream;
+using std::string;
+
+
+namespace {
+
+ostream * pout= 0;
+bool flag= true;
+size_t indent= 0;
+
+TraceFunc * initial= NULL;
+TraceFunc * * lastpos= & initial;
+
+ostream * opentracefile (const char * str)
+{
+ std::ofstream * pof=
+ new ofstream (str, std::ios::app | std::ios::out);
+ if (! pof->is_open () )
+ {
+ cerr << "Error opening " << str << endl;
+ delete pof;
+ pof= 0;
+ }
+ return pof;
+}
+
+void showinfo (const char * strenterexit, const char * strfunc)
+{
+ if (pout)
+ {
+ * pout << string (indent, ' ') << strenterexit << ' ';
+
+ if (std::uncaught_exception () )
+ * pout << "(throwing) ";
+
+ * pout << strfunc << endl;
+ }
+}
+
+const char BAD_USE []= "Bad use of TraceFunc";
+
+} // namespace
+
+TraceFunc::TraceFunc (const char * strFuncName) :
+ strfunc (strFuncName),
+ next (NULL)
+{
+ if (flag)
+ {
+ flag= false;
+ char * aux= getenv ("TRACEFUNC");
+ if (aux)
+ {
+ if (strcmp (aux, "-") == 0)
+ pout= & std::cerr;
+ else
+ pout= opentracefile (aux);
+ }
+ }
+
+ //tracelist.push_back (this);
+ previous= lastpos;
+ * lastpos= this;
+ lastpos= & next;
+
+ #if 0
+ if (pout)
+ {
+ * pout << string (indent, ' ') << "Enter ";
+
+ if (std::uncaught_exception () )
+ * pout << "(throwing) ";
+
+ * pout << strfunc << endl;
+ }
+ #else
+ showinfo ("Enter", strfunc);
+ #endif
+ ++indent;
+}
+
+TraceFunc::~TraceFunc ()
+{
+ --indent;
+
+ #if 0
+ if (pout)
+ {
+ * pout << string (indent, ' ') << "Exit ";
+
+ if (std::uncaught_exception () )
+ * pout << "(throwing) ";
+
+ * pout << strfunc << endl;
+ }
+ #else
+ showinfo ("Exit", strfunc);
+ #endif
+
+ if (next != NULL)
+ {
+ cerr << BAD_USE << endl;
+ abort ();
+ }
+ if (lastpos != & next)
+ {
+ //throw std::logic_error ("Bad use of TraceFunc");
+ cerr << BAD_USE << endl;
+ abort ();
+ }
+ lastpos= previous;
+ if (* lastpos != this)
+ {
+ cerr << BAD_USE << endl;
+ abort ();
+ }
+ * lastpos= NULL;
+}
+
+void TraceFunc::message (const std::string & strMes)
+{
+ if (pout)
+ {
+ * pout << string (indent, ' ') << strfunc;
+
+ if (std::uncaught_exception () )
+ * pout << "(throwing) ";
+
+ * pout << ": " << strMes << endl;
+ }
+}
+
+void TraceFunc::show (int)
+{
+ cerr << "\r\n";
+
+ if (initial == NULL)
+ cerr << "TraceFunc: no calls.";
+ else
+ {
+ cerr << "TraceFunc dump of calls: \r\n";
+ for (TraceFunc * act= initial; act != NULL; act= act->next)
+ cerr << act->strfunc << "\r\n";
+ cerr << "TraceFunc dump ended.";
+ }
+ cerr << "\r\n";
+}
+
+// Fin de trace.cpp
Un proyecto texto-plano.xyz