fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 221 lines 4.4 kB view raw
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}