/
dbg.go
82 lines (68 loc) · 1.84 KB
/
dbg.go
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
package main
/*
Author: Jeff Berkowitz
Copyright (C) 2024 Jeff Berkowitz
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
*/
import (
"fmt"
"os"
"runtime"
"runtime/debug"
)
func assert(b bool, msg string) {
if !b {
panic("assertion failure: " + msg)
}
}
func fatal(s string) {
pr(s)
os.Exit(2)
}
func pr(s string) {
fmt.Fprintln(os.Stderr, "func: "+s)
}
var dbEnabled bool
func dbg(s string, args ...any) {
// dbgN(1, ...) is this function
dbgN(2, s, args...)
}
func dbgN(n int, s string, args ...any) {
if !dbEnabled {
return
}
pc, _, _, ok := runtime.Caller(n)
details := runtime.FuncForPC(pc)
where := "???"
if ok && details != nil {
where = details.Name()
}
s = "[at " + where + "]: " + s + "\n"
fmt.Fprintf(os.Stderr, s, args...)
}
func dbgST() {
debug.PrintStack()
}
var todoDone = make(map[string]bool)
// This function prints the callers name and TODO once per
// execution of the calling program. Arguments are ignored
// and are provided to make reference to unreference variables
// in a partially completely implementation.
func TODO(args ...any) error {
pc, _, _, ok := runtime.Caller(1)
details := runtime.FuncForPC(pc)
if ok && details != nil && !todoDone[details.Name()] {
dbg("TODO called from %s", details.Name())
todoDone[details.Name()] = true
}
return nil
}