-
Notifications
You must be signed in to change notification settings - Fork 34
/
printer.clay
85 lines (61 loc) · 1.89 KB
/
printer.clay
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
import core.errors.(private assertStringLiteral);
import core.errors.backtrace.(showBacktrace);
public import printer.protocol.*;
public import printer.types.*;
// io.errors and io.errors must be imported after printer.types, to make sure
// printTo(stream, GenericIOError) is not hidden by printTo(stream, record)
import io.files.raw.(stderrRawFile,stdoutRawFile);
import io.streams.(write,flush);
import libc;
import data.vectors.(moveVectorBuffer);
import data.strings.(String);
import printer.exceptions as unused;
/// @section print, println, printlnTo
forceinline print(..x) {
printTo(stdoutRawFile(), ..x);
}
forceinline println(..x) {
printTo(stdoutRawFile(), ..x, '\n');
}
forceinline printlnTo(stream, ..x) {
printTo(stream, ..x, '\n');
}
/// @section str, strln
overload str(forward ..x) {
var s = String();
printTo(s, ..x);
return move(s);
}
/// @section error, errorNoThrow, assert with pretty-printed message
errorNoThrow(..e) {
var err = stderrRawFile();
printlnTo(err, "error: ", ..e);
showBacktrace();
libc.abort();
}
define error;
[when not ExceptionsEnabled?]
overload error(..e) {
errorNoThrow(..e);
}
[when ExceptionsEnabled?]
overload error(..e) {
var buf = String();
printTo(buf, ..e);
cstring(buf);
throw Error(CStringRef(Pointer[Int8](moveVectorBuffer(buf))));
}
[when AllAssertionsEnabled?()]
alias overload assert(cond:Bool, ..args) {
if (not cond)
errorWithPrintfNoThrow(
assertStringLiteral(__FILE__, #__LINE__, #__COLUMN__, __ARG__ cond, ": %s"),
cstring(str(..args)));
}
[..tags when AllAssertionsEnabled?() and allValues?(AssertionEnabled?, ..tags)]
alias overload assert[..tags](cond:Bool, ..args) {
if (not cond)
errorWithPrintfNoThrow(
assertStringLiteral(__FILE__, #__LINE__, #__COLUMN__, __ARG__ cond, ": %s"),
cstring(str(..args)));
}