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