You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
945 B
Go
50 lines
945 B
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
// +build darwin,ios
|
|
|
|
package log
|
|
|
|
/*
|
|
#cgo CFLAGS: -Werror -fmodules -fobjc-arc -x objective-c
|
|
|
|
__attribute__ ((visibility ("hidden"))) void nslog(char *str);
|
|
*/
|
|
import "C"
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"log"
|
|
"unsafe"
|
|
|
|
_ "gioui.org/app/internal/cocoainit"
|
|
)
|
|
|
|
func init() {
|
|
// macOS Console already includes timestamps.
|
|
log.SetFlags(log.Flags() &^ log.LstdFlags)
|
|
log.SetOutput(newNSLogWriter())
|
|
}
|
|
|
|
func newNSLogWriter() io.Writer {
|
|
r, w := io.Pipe()
|
|
go func() {
|
|
// 1024 is an arbitrary truncation limit, taken from Android's
|
|
// log buffer size.
|
|
lineBuf := bufio.NewReaderSize(r, 1024)
|
|
// The buffer to pass to C, including the terminating '\0'.
|
|
buf := make([]byte, lineBuf.Size()+1)
|
|
cbuf := (*C.char)(unsafe.Pointer(&buf[0]))
|
|
for {
|
|
line, _, err := lineBuf.ReadLine()
|
|
if err != nil {
|
|
break
|
|
}
|
|
copy(buf, line)
|
|
buf[len(line)] = 0
|
|
C.nslog(cbuf)
|
|
}
|
|
}()
|
|
return w
|
|
}
|