fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/lib/log.c *
7 * Created: 2003-02-02 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2003-2022 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#include <config.h>
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <stdarg.h>
28
29#include <lib/log.h>
30
31
32typedef struct {
33 FILE *fp;
34 int close;
35 unsigned level;
36} pce_log_t;
37
38
39static unsigned par_log_cnt = 0;
40static pce_log_t par_log[PCE_LOG_MAX];
41
42
43void pce_log_init (void)
44{
45 par_log_cnt = 0;
46}
47
48void pce_log_done (void)
49{
50 unsigned i;
51
52 for (i = 0; i < par_log_cnt; i++) {
53 if (par_log[i].close) {
54 fclose (par_log[i].fp);
55 }
56 }
57
58 par_log_cnt = 0;
59}
60
61int pce_log_add_fp (FILE *fp, int close, unsigned level)
62{
63 if (par_log_cnt >= PCE_LOG_MAX) {
64 return (1);
65 }
66
67 par_log[par_log_cnt].fp = fp;
68 par_log[par_log_cnt].close = (close != 0);
69 par_log[par_log_cnt].level = level;
70
71 par_log_cnt += 1;
72
73 return (0);
74}
75
76int pce_log_add_fname (const char *fname, unsigned level)
77{
78 FILE *fp;
79
80 fp = fopen (fname, "a");
81
82 if (fp == NULL) {
83 return (1);
84 }
85
86 if (pce_log_add_fp (fp, 1, level)) {
87 fclose (fp);
88 return (1);
89 }
90
91 return (0);
92}
93
94void pce_log_rmv_fp (FILE *fp)
95{
96 unsigned i, j;
97
98 i = 0;
99 while (i < par_log_cnt) {
100 if (par_log[i].fp == fp) {
101 if (par_log[i].close) {
102 fclose (par_log[i].fp);
103 }
104
105 for (j = i + 1; j < par_log_cnt; j++) {
106 par_log[j - 1] = par_log[j];
107 }
108
109 par_log_cnt -= 1;
110 }
111 else {
112 i += 1;
113 }
114 }
115}
116
117void pce_log_set_level (FILE *fp, unsigned level)
118{
119 unsigned i;
120
121 for (i = 0; i < par_log_cnt; i++) {
122 if (par_log[i].fp == fp) {
123 par_log[i].level = level;
124 return;
125 }
126 }
127}
128
129unsigned pce_log_get_level (FILE *fp)
130{
131 unsigned i;
132
133 for (i = 0; i < par_log_cnt; i++) {
134 if (par_log[i].fp == fp) {
135 return (par_log[i].level);
136 }
137 }
138
139 return (MSG_DEB);
140}
141
142void pce_log (unsigned level, const char *msg, ...)
143{
144 unsigned i;
145 va_list va;
146
147 for (i = 0; i < par_log_cnt; i++) {
148 if (level <= par_log[i].level) {
149 va_start (va, msg);
150 vfprintf (par_log[i].fp, msg, va);
151 va_end (va);
152 fflush (par_log[i].fp);
153 }
154 }
155}
156
157void pce_log_va (unsigned level, const char *msg, va_list va)
158{
159 unsigned i;
160 va_list tmp;
161
162 for (i = 0; i < par_log_cnt; i++) {
163 if (level <= par_log[i].level) {
164#ifdef va_copy
165 va_copy (tmp, va);
166#else
167 tmp = va;
168#endif
169 vfprintf (par_log[i].fp, msg, tmp);
170 va_end (tmp);
171 fflush (par_log[i].fp);
172 }
173 }
174}
175
176void pce_log_deb (const char *msg, ...)
177{
178 va_list va;
179
180 va_start (va, msg);
181 pce_log_va (MSG_DEB, msg, va);
182 va_end (va);
183}
184
185void pce_log_inf (const char *msg, ...)
186{
187 va_list va;
188
189 va_start (va, msg);
190 pce_log_va (MSG_INF, msg, va);
191 va_end (va);
192}
193
194void pce_log_err (const char *msg, ...)
195{
196 va_list va;
197
198 va_start (va, msg);
199 pce_log_va (MSG_ERR, msg, va);
200 va_end (va);
201}
202
203void pce_log_tag (unsigned level, const char *tag, const char *msg, ...)
204{
205 unsigned i;
206 va_list va;
207
208 if (tag == NULL) {
209 tag = "";
210 }
211
212 for (i = 0; i < par_log_cnt; i++) {
213 if (level <= par_log[i].level) {
214 va_start (va, msg);
215 fprintf (par_log[i].fp, "%-9s ", tag);
216 vfprintf (par_log[i].fp, msg, va);
217 va_end (va);
218 fflush (par_log[i].fp);
219 }
220 }
221}