summaryrefslogtreecommitdiff
path: root/3dc/win95/DEBUGLOG.HPP
diff options
context:
space:
mode:
Diffstat (limited to '3dc/win95/DEBUGLOG.HPP')
-rw-r--r--3dc/win95/DEBUGLOG.HPP179
1 files changed, 179 insertions, 0 deletions
diff --git a/3dc/win95/DEBUGLOG.HPP b/3dc/win95/DEBUGLOG.HPP
new file mode 100644
index 0000000..5a0087e
--- /dev/null
+++ b/3dc/win95/DEBUGLOG.HPP
@@ -0,0 +1,179 @@
+#ifndef _included_debuglog_hpp_
+#define _included_debuglog_hpp_
+
+#include <stdio.h>
+#include "debuglog.h"
+#include "list_tem.hpp"
+
+/* Changed 27/1/98 by DHM:
+ -----------------------
+
+ Made LogFile derived from R_DumpContext rather than being a base class.
+
+ This is in order to give a clean interface for debug dumps to e.g. the
+ screen, with the same interface as to a log file. This base class will
+ perform an analagous role to the class CDumpContext in the Microsoft
+ Foundation Class library.
+
+ The virtual functions dputs(), dprintf() and vdprintf() will eventually replace
+ lputs(), lprintf() and vlprintf().
+
+ For the moment I've copied and pasted the implementations of both. I would prefer
+ in the short term to make one call the other, but this isn't easy with variable
+ arguments. In the long term I want to eliminate the l* functions (lputs() etc)
+ but can't because of heritage code (and heritage libraries).
+*/
+
+ #ifndef _dcontext_hpp
+ #include "dcontext.hpp"
+ #endif
+
+struct LogFile : public R_DumpContext
+{
+private:
+ char * fname;
+ List<char *> unwritten;
+ int ever_written;
+ void FlushOut(FILE * fp);
+
+public:
+ LogFile(char const * const _fname);
+ virtual ~LogFile();
+ LogFile & operator = (LogFile const & l);
+ LogFile(LogFile const & l);
+
+ // {{{ Virtual dump implementations:
+ inline int dputs(char const * const buf)
+ {
+ if (!fname) return EOF;
+ FILE * fp = fopen(fname,"a");
+ if (!fp)
+ {
+ if (!ever_written) return EOF;
+ char * newtxt = new char [strlen(buf)+1];
+ strcpy(newtxt,buf);
+ unwritten.add_entry_end(newtxt);
+ return 0;
+ }
+ if (unwritten.size()) FlushOut(fp);
+ ever_written = 1;
+ int rv = fputs(buf,fp);
+ fclose(fp);
+ return rv;
+ }
+
+ inline int dprintf(char const * format, ... )
+ {
+ if (!fname) return -1;
+ FILE * fp = fopen(fname,"a");
+ if (!fp && !ever_written) return -1;
+ va_list ap;
+ va_start(ap, format);
+ int rv;
+ if (fp)
+ {
+ if (unwritten.size()) FlushOut(fp);
+ rv = vfprintf(fp,format,ap);
+ ever_written = 1;
+ }
+ else
+ {
+ char buf[4096];
+ rv = vsprintf(buf,format,ap);
+ char * newtxt = new char [strlen(buf)+1];
+ strcpy(newtxt,buf);
+ unwritten.add_entry_end(newtxt);
+ }
+ va_end(ap);
+ if (fp) fclose(fp);
+ return rv;
+ }
+
+ inline int vdprintf(char const * format, va_list ap)
+ {
+ if (!fname) return -1;
+ FILE * fp = fopen(fname,"a");
+ if (!fp && !ever_written) return -1;
+
+ int rv;
+ if (fp)
+ {
+ if (unwritten.size()) FlushOut(fp);
+ rv = vfprintf(fp,format,ap);
+ ever_written = 1;
+ fclose(fp);
+ }
+ else
+ {
+ char buf[4096];
+ rv = vsprintf(buf,format,ap);
+ char * newtxt = new char [strlen(buf)+1];
+ strcpy(newtxt,buf);
+ unwritten.add_entry_end(newtxt);
+ }
+ return rv;
+ }
+ // }}}
+
+ // {{{ Deprecated logging functions:
+ inline int lputs(char const * const buf)
+ {
+ return dputs(buf);
+ }
+
+ inline int lprintf(char const * format, ... )
+ {
+ if (!fname) return -1;
+ FILE * fp = fopen(fname,"a");
+ if (!fp && !ever_written) return -1;
+ va_list ap;
+ va_start(ap, format);
+ int rv;
+ if (fp)
+ {
+ if (unwritten.size()) FlushOut(fp);
+ rv = vfprintf(fp,format,ap);
+ ever_written = 1;
+ }
+ else
+ {
+ char buf[4096];
+ rv = vsprintf(buf,format,ap);
+ char * newtxt = new char [strlen(buf)+1];
+ strcpy(newtxt,buf);
+ unwritten.add_entry_end(newtxt);
+ }
+ va_end(ap);
+ if (fp) fclose(fp);
+ return rv;
+ }
+
+ inline int vlprintf(char const * format, va_list ap)
+ {
+ if (!fname) return -1;
+ FILE * fp = fopen(fname,"a");
+ if (!fp && !ever_written) return -1;
+
+ int rv;
+ if (fp)
+ {
+ if (unwritten.size()) FlushOut(fp);
+ rv = vfprintf(fp,format,ap);
+ ever_written = 1;
+ fclose(fp);
+ }
+ else
+ {
+ char buf[4096];
+ rv = vsprintf(buf,format,ap);
+ char * newtxt = new char [strlen(buf)+1];
+ strcpy(newtxt,buf);
+ unwritten.add_entry_end(newtxt);
+ }
+ return rv;
+ }
+ // }}}
+
+};
+
+#endif // ! _included_debuglog_hpp_