1 /*
2 ===========================================================================
3 Copyright (C) 1999-2005 Id Software, Inc.
4 
5 This file is part of Quake III Arena source code.
6 
7 Quake III Arena source code is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the License,
10 or (at your option) any later version.
11 
12 Quake III Arena source code is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Quake III Arena source code; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 ===========================================================================
21 */
22 
23 /*****************************************************************************
24  * name:		l_log.c
25  *
26  * desc:		log file
27  *
28  * $Archive: /MissionPack/CODE/botlib/l_log.c $
29  *
30  *****************************************************************************/
31 
32 #include <stdlib.h>
33 #include <stdio.h>
34 #include <string.h>
35 
36 #include "../qcommon/q_shared.h"
37 #include "botlib.h"
38 #include "be_interface.h"			//for botimport.Print
39 #include "l_libvar.h"
40 #include "l_log.h"
41 
42 #define MAX_LOGFILENAMESIZE		1024
43 
44 typedef struct logfile_s
45 {
46 	char filename[MAX_LOGFILENAMESIZE];
47 	FILE *fp;
48 	int numwrites;
49 } logfile_t;
50 
51 static logfile_t logfile;
52 
53 //===========================================================================
54 //
55 // Parameter:				-
56 // Returns:					-
57 // Changes Globals:		-
58 //===========================================================================
Log_Open(char * filename)59 void Log_Open(char *filename)
60 {
61 	if (!LibVarValue("log", "0")) return;
62 	if (!filename || !strlen(filename))
63 	{
64 		botimport.Print(PRT_MESSAGE, "openlog <filename>\n");
65 		return;
66 	} //end if
67 	if (logfile.fp)
68 	{
69 		botimport.Print(PRT_ERROR, "log file %s is already opened\n", logfile.filename);
70 		return;
71 	} //end if
72 	logfile.fp = fopen(filename, "wb");
73 	if (!logfile.fp)
74 	{
75 		botimport.Print(PRT_ERROR, "can't open the log file %s\n", filename);
76 		return;
77 	} //end if
78 	strncpy(logfile.filename, filename, MAX_LOGFILENAMESIZE);
79 	botimport.Print(PRT_MESSAGE, "Opened log %s\n", logfile.filename);
80 } //end of the function Log_Create
81 //===========================================================================
82 //
83 // Parameter:				-
84 // Returns:					-
85 // Changes Globals:		-
86 //===========================================================================
Log_Close(void)87 void Log_Close(void)
88 {
89 	if (!logfile.fp) return;
90 	if (fclose(logfile.fp))
91 	{
92 		botimport.Print(PRT_ERROR, "can't close log file %s\n", logfile.filename);
93 		return;
94 	} //end if
95 	logfile.fp = NULL;
96 	botimport.Print(PRT_MESSAGE, "Closed log %s\n", logfile.filename);
97 } //end of the function Log_Close
98 //===========================================================================
99 //
100 // Parameter:				-
101 // Returns:					-
102 // Changes Globals:		-
103 //===========================================================================
Log_Shutdown(void)104 void Log_Shutdown(void)
105 {
106 	if (logfile.fp) Log_Close();
107 } //end of the function Log_Shutdown
108 //===========================================================================
109 //
110 // Parameter:				-
111 // Returns:					-
112 // Changes Globals:		-
113 //===========================================================================
Log_Write(char * fmt,...)114 void QDECL Log_Write(char *fmt, ...)
115 {
116 	va_list ap;
117 
118 	if (!logfile.fp) return;
119 	va_start(ap, fmt);
120 	vfprintf(logfile.fp, fmt, ap);
121 	va_end(ap);
122 	//fprintf(logfile.fp, "\r\n");
123 	fflush(logfile.fp);
124 } //end of the function Log_Write
125 //===========================================================================
126 //
127 // Parameter:				-
128 // Returns:					-
129 // Changes Globals:		-
130 //===========================================================================
Log_WriteTimeStamped(char * fmt,...)131 void QDECL Log_WriteTimeStamped(char *fmt, ...)
132 {
133 	va_list ap;
134 
135 	if (!logfile.fp) return;
136 	fprintf(logfile.fp, "%d   %02d:%02d:%02d:%02d   ",
137 					logfile.numwrites,
138 					(int) (botlibglobals.time / 60 / 60),
139 					(int) (botlibglobals.time / 60),
140 					(int) (botlibglobals.time),
141 					(int) ((int) (botlibglobals.time * 100)) -
142 							((int) botlibglobals.time) * 100);
143 	va_start(ap, fmt);
144 	vfprintf(logfile.fp, fmt, ap);
145 	va_end(ap);
146 	fprintf(logfile.fp, "\r\n");
147 	logfile.numwrites++;
148 	fflush(logfile.fp);
149 } //end of the function Log_Write
150 //===========================================================================
151 //
152 // Parameter:				-
153 // Returns:					-
154 // Changes Globals:		-
155 //===========================================================================
Log_FilePointer(void)156 FILE *Log_FilePointer(void)
157 {
158 	return logfile.fp;
159 } //end of the function Log_FilePointer
160 //===========================================================================
161 //
162 // Parameter:				-
163 // Returns:					-
164 // Changes Globals:		-
165 //===========================================================================
Log_Flush(void)166 void Log_Flush(void)
167 {
168 	if (logfile.fp) fflush(logfile.fp);
169 } //end of the function Log_Flush
170 
171