1 #include <string.h>
2 #include <stdlib.h>
3 #include "debuglog.hpp"
4
LogFile(char const * const _fname)5 LogFile::LogFile(char const * const _fname) : fname(0) , ever_written(0)
6 {
7 FILE * fp = fopen(_fname,"w");
8 if (fp)
9 {
10 fclose(fp);
11 fname = new char[strlen(_fname)+1];
12 strcpy(fname,_fname);
13 return;
14 }
15 char const * path = getenv("TEMP");
16 if (!path) path = getenv("TMP");
17 if (!path) return;
18 fname = new char[strlen(path)+1+strlen(_fname)+1];
19 strcpy(fname,path);
20 strncat(fname,"\\",1);
21 strcat(fname,_fname);
22 fp = fopen(fname,"w");
23 if (fp)
24 fclose(fp);
25 else
26 {
27 delete[] fname;
28 fname = 0;
29 }
30 }
31
~LogFile()32 LogFile::~LogFile()
33 {
34 if (unwritten.size())
35 {
36 FILE * fp = fopen(fname,"a");
37 for (int attempt=0; !fp && attempt<10; ++attempt)
38 {
39 /* Sleep(100); */
40 fp = fopen(fname,"a");
41 }
42 if (fp)
43 {
44 FlushOut(fp);
45 fclose(fp);
46 }
47 }
48 if (fname) delete[] fname;
49 }
50
operator =(LogFile const & l)51 LogFile & LogFile::operator = (LogFile const & l)
52 {
53 if (&l != this)
54 {
55 if (fname) delete[] fname;
56 if (l.fname)
57 {
58 fname = new char[strlen(l.fname)+1];
59 strcpy(fname,l.fname);
60 }
61 else
62 fname = 0;
63
64 unwritten = l.unwritten;
65 ever_written = l.ever_written;
66 }
67 return *this;
68 }
69
LogFile(LogFile const & l)70 LogFile::LogFile(LogFile const & l)
71 : unwritten(l.unwritten)
72 , ever_written(l.ever_written)
73 {
74 if (l.fname)
75 {
76 fname = new char[strlen(l.fname)+1];
77 strcpy(fname,l.fname);
78 }
79 else
80 fname = 0;
81 }
82
FlushOut(FILE * fp)83 void LogFile::FlushOut(FILE * fp)
84 {
85 while (unwritten.size())
86 {
87 char * str = unwritten.first_entry();
88 unwritten.delete_first_entry();
89 fputs(str,fp);
90 delete[] str;
91 }
92 }
93
vlfprintf(LOGFILE * lfp,char const * format,va_list args)94 int vlfprintf(LOGFILE * lfp, char const * format, va_list args )
95 {
96 return lfp->vlprintf(format,args);
97 }
98
lfprintf(LOGFILE * lfp,char const * format,...)99 int lfprintf(LOGFILE * lfp, char const * format, ... )
100 {
101 va_list ap;
102 va_start(ap, format);
103 int rv = lfp->vlprintf(format,ap);
104 va_end(ap);
105 return rv;
106 }
107
lfputs(LOGFILE * lfp,char const * str)108 int lfputs(LOGFILE * lfp, char const * str)
109 {
110 return lfp->lputs(str);
111 }
112
lfopen(char const * fname)113 LOGFILE * lfopen(char const * fname)
114 {
115 return new LogFile(fname);
116 }
117
lfclose(LOGFILE * lfp)118 void lfclose(LOGFILE * lfp)
119 {
120 delete lfp;
121 }
122