1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-11 15:49:38 +00:00
CLK/Outputs/Log.hpp

172 lines
4.1 KiB
C++
Raw Permalink Normal View History

//
// Log.hpp
// Clock Signal
//
// Created by Thomas Harte on 18/06/2018.
// Copyright © 2018 Thomas Harte. All rights reserved.
//
#pragma once
2024-01-20 03:02:26 +00:00
#include <cstdio>
#include <cstdarg>
namespace Log {
2024-01-18 21:37:07 +00:00
// TODO: if adopting C++20, std::format would be a better model to apply below.
// But I prefer C files to C++ streams, so here it is for now.
enum class Source {
2024-01-20 03:02:26 +00:00
ADBDevice,
2024-01-19 19:16:13 +00:00
ADBGLU,
Amiga,
AmigaDisk,
AmigaCopper,
AmigaChipset,
AmigaBlitter,
2024-02-15 18:55:46 +00:00
AppleIISCSICard,
Archimedes,
ARMIOC,
ARMMEMC,
ARMVIDC,
AtariST,
AtariSTDMAController,
2024-01-19 19:00:53 +00:00
CommodoreStaticAnalyser,
CMOSRTC,
DirectAccessDevice,
Enterprise,
i8272,
2024-03-18 15:09:29 +00:00
I2C,
IntelligentKeyboard, // Could probably be subsumed into 'Keyboard'?
IWM,
Keyboard,
M50740,
Macintosh,
MasterSystem,
2024-01-19 19:22:23 +00:00
MultiMachine,
MFP68901,
2024-02-15 18:32:49 +00:00
MOS6526,
MSX,
NCR5380,
OpenGL,
2024-01-19 19:22:23 +00:00
PCMTrack,
2024-01-19 15:47:21 +00:00
SCC,
SCSI,
SZX,
TapeUEF,
TMS9918,
TZX,
2024-01-20 03:02:26 +00:00
Vic20,
WDFDC,
2024-01-18 21:37:07 +00:00
};
constexpr bool is_enabled(Source source) {
#ifdef NDEBUG
return false;
#endif
// Allow for compile-time source-level enabling and disabling of different sources.
switch(source) {
default: return true;
2024-01-19 15:47:21 +00:00
// The following are all things I'm not actively working on.
2024-01-20 03:14:24 +00:00
case Source::AmigaBlitter:
case Source::AmigaChipset:
2024-01-20 03:02:26 +00:00
case Source::AmigaCopper:
case Source::AmigaDisk:
2024-02-15 18:55:46 +00:00
case Source::DirectAccessDevice:
2024-01-19 20:38:40 +00:00
case Source::IWM:
2024-01-19 19:22:23 +00:00
case Source::MFP68901:
case Source::NCR5380:
2024-02-15 18:55:46 +00:00
case Source::SCC:
case Source::SCSI:
2024-03-27 01:54:42 +00:00
case Source::I2C:
case Source::Keyboard:
2024-02-15 18:55:46 +00:00
return false;
}
}
constexpr const char *prefix(Source source) {
switch(source) {
2024-01-19 19:00:53 +00:00
default: return nullptr;
2024-01-20 03:02:26 +00:00
case Source::ADBDevice: return "ADB device";
2024-01-19 19:16:13 +00:00
case Source::ADBGLU: return "ADB GLU";
2024-01-20 03:14:24 +00:00
case Source::AmigaBlitter: return "Blitter";
case Source::AmigaChipset: return "Chipset";
2024-01-20 03:02:26 +00:00
case Source::AmigaCopper: return "Copper";
case Source::AmigaDisk: return "Disk";
2024-02-15 18:55:46 +00:00
case Source::AppleIISCSICard: return "SCSI card";
case Source::Archimedes: return "Archimedes";
case Source::ARMIOC: return "IOC";
case Source::ARMMEMC: return "MEMC";
case Source::ARMVIDC: return "VIDC";
2024-01-19 19:16:13 +00:00
case Source::AtariST: return "AtariST";
case Source::AtariSTDMAController: return "DMA";
2024-01-20 03:02:26 +00:00
case Source::CommodoreStaticAnalyser: return "Commodore Static Analyser";
case Source::CMOSRTC: return "CMOSRTC";
2024-02-15 18:55:46 +00:00
case Source::DirectAccessDevice: return "Direct Access Device";
2024-01-20 03:02:26 +00:00
case Source::Enterprise: return "Enterprise";
2024-01-19 19:00:53 +00:00
case Source::i8272: return "i8272";
2024-03-18 15:09:29 +00:00
case Source::I2C: return "I2C";
2024-01-20 03:02:26 +00:00
case Source::IntelligentKeyboard: return "IKYB";
2024-01-19 20:38:40 +00:00
case Source::IWM: return "IWM";
case Source::Keyboard: return "Keyboard";
2024-01-20 03:02:26 +00:00
case Source::M50740: return "M50740";
case Source::Macintosh: return "Macintosh";
case Source::MasterSystem: return "SMS";
2024-02-15 18:32:49 +00:00
case Source::MOS6526: return "MOS6526";
2024-01-19 19:22:23 +00:00
case Source::MFP68901: return "MFP68901";
2024-01-20 03:02:26 +00:00
case Source::MultiMachine: return "Multi-machine";
case Source::MSX: return "MSX";
2024-01-19 19:00:53 +00:00
case Source::NCR5380: return "5380";
2024-01-20 03:02:26 +00:00
case Source::OpenGL: return "OpenGL";
2024-01-19 19:22:23 +00:00
case Source::PCMTrack: return "PCM Track";
2024-01-19 19:00:53 +00:00
case Source::SCSI: return "SCSI";
case Source::SCC: return "SCC";
2024-01-19 19:16:13 +00:00
case Source::SZX: return "SZX";
case Source::TapeUEF: return "UEF";
case Source::TZX: return "TZX";
2024-01-20 03:02:26 +00:00
case Source::Vic20: return "Vic20";
2024-01-19 19:00:53 +00:00
case Source::WDFDC: return "WD FDC";
}
}
template <Source source>
2024-01-18 21:37:07 +00:00
class Logger {
public:
2024-01-19 19:22:23 +00:00
static constexpr bool enabled = is_enabled(source);
2024-01-18 21:37:07 +00:00
struct LogLine {
public:
LogLine(FILE *stream) : stream_(stream) {
2024-01-19 19:22:23 +00:00
if constexpr (!enabled) return;
const auto source_prefix = prefix(source);
if(source_prefix) {
fprintf(stream_, "[%s] ", source_prefix);
2024-01-18 21:37:07 +00:00
}
}
2024-01-18 21:37:07 +00:00
~LogLine() {
2024-01-19 19:22:23 +00:00
if constexpr (!enabled) return;
2024-01-18 21:37:07 +00:00
fprintf(stream_, "\n");
}
2024-01-18 21:37:07 +00:00
void append(const char *format, ...) {
2024-01-19 19:22:23 +00:00
if constexpr (!enabled) return;
2024-01-18 21:37:07 +00:00
va_list args;
va_start(args, format);
vfprintf(stream_, format, args);
va_end(args);
}
2024-01-18 21:37:07 +00:00
private:
FILE *stream_;
};
LogLine info() { return LogLine(stdout); }
LogLine error() { return LogLine(stderr); }
2024-01-18 21:37:07 +00:00
};
}