38 lines
728 B
Go
38 lines
728 B
Go
// +build !appengine,linux freebsd darwin dragonfly netbsd openbsd
|
|
|
|
package kingpin
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
"strconv"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
func guessWidth(w io.Writer) int {
|
|
// check if COLUMNS env is set to comply with
|
|
// http://pubs.opengroup.org/onlinepubs/009604499/basedefs/xbd_chap08.html
|
|
colsStr := os.Getenv("COLUMNS")
|
|
if colsStr != "" {
|
|
if cols, err := strconv.Atoi(colsStr); err == nil {
|
|
return cols
|
|
}
|
|
}
|
|
|
|
if t, ok := w.(*os.File); ok {
|
|
fd := t.Fd()
|
|
var dimensions [4]uint16
|
|
|
|
if _, _, err := syscall.Syscall6(
|
|
syscall.SYS_IOCTL,
|
|
uintptr(fd),
|
|
uintptr(syscall.TIOCGWINSZ),
|
|
uintptr(unsafe.Pointer(&dimensions)),
|
|
0, 0, 0,
|
|
); err == 0 {
|
|
return int(dimensions[1])
|
|
}
|
|
}
|
|
return 80
|
|
}
|