blob: 88ed2448a0f085405391d9e1b44e3f5a11fe6e89 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
/* -------------------------------------------
Copyright Mahrouss Logic
------------------------------------------- */
#pragma once
#include <KernelKit/DeviceManager.hpp>
#include <CompilerKit/CompilerKit.hxx>
#include <NewKit/OwnPtr.hpp>
#include <NewKit/Stream.hpp>
#define kDebugMaxPorts 16
#define kDebugUnboundPort 0x0FEED
#define kDebugMag0 'H'
#define kDebugMag1 'D'
#define kDebugMag2 'B'
#define kDebugMag3 'G'
#define kDebugSourceFile 0
#define kDebugLine 33
#define kDebugTeam 43
#define kDebugEOP 49
namespace HCore {
// @brief Emulates a VT100 terminal.
class TerminalDevice final : public DeviceInterface<const Char *> {
public:
TerminalDevice(void (*print)(const Char *), void (*get)(const Char *))
: DeviceInterface<const Char *>(print, get) {}
virtual ~TerminalDevice() {}
/// @brief returns device name (terminal name)
/// @return string type (const char*)
virtual const char *Name() const override { return ("TerminalDevice"); }
HCORE_COPY_DEFAULT(TerminalDevice);
static TerminalDevice Shared() noexcept;
};
inline TerminalDevice end_line() {
TerminalDevice selfTerm = TerminalDevice::Shared();
selfTerm << "\n";
return selfTerm;
}
inline TerminalDevice carriage_return() {
TerminalDevice selfTerm = TerminalDevice::Shared();
selfTerm << "\r";
return selfTerm;
}
namespace Detail {
inline TerminalDevice _write_number_hex(const Long &x, TerminalDevice& term) {
int y = x / 16;
int h = x % 16;
if (y) _write_number_hex(y, term);
/* fail if the hex number is not base-16 */
if (h > 15) {
_write_number_hex('?', term);
return term;
}
if (y < 0) y = -y;
const char NUMBERS[17] = "0123456789ABCDEF";
Char buf[2];
buf[0] = NUMBERS[h];
buf[1] = 0;
term << buf;
return term;
}
} // namespace Detail
inline TerminalDevice hex_number(const Long &x) {
TerminalDevice selfTerm = TerminalDevice::Shared();
Detail::_write_number_hex(x, selfTerm);
return selfTerm;
}
inline TerminalDevice get_console_in(Char* buf) {
TerminalDevice selfTerm = TerminalDevice::Shared();
selfTerm >> buf;
return selfTerm;
}
typedef Char rt_debug_type[255];
class DebuggerPortHeader final {
public:
Int16 fPort[kDebugMaxPorts];
Int16 fBoundCnt;
};
} // namespace HCore
#ifdef kcout
#undef kcout
#endif // ifdef kcout
#define kcout TerminalDevice::Shared()
#define endl end_line()
|