mirror of
https://github.com/mjl-/mox.git
synced 2024-12-25 16:03:48 +03:00
80 lines
1.3 KiB
Go
80 lines
1.3 KiB
Go
|
//go:build tools
|
||
|
// +build tools
|
||
|
|
||
|
// For unexpand the 4 spaces that the typescript compiler outputs into tabs.
|
||
|
// Not all unexpand commands implement the -t flag (openbsd).
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"log"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
func xcheckf(err error, format string, args ...any) {
|
||
|
if err != nil {
|
||
|
log.Fatalf("%s: %s", fmt.Sprintf(format, args...), err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
log.SetFlags(0)
|
||
|
var width int
|
||
|
flag.IntVar(&width, "t", 8, "tab width")
|
||
|
flag.Parse()
|
||
|
flag.Usage = func() {
|
||
|
log.Print("usage: unexpand [-t tabwidth] < input.spaces >output.tabs")
|
||
|
flag.PrintDefaults()
|
||
|
os.Exit(2)
|
||
|
}
|
||
|
if flag.NArg() != 0 {
|
||
|
flag.Usage()
|
||
|
}
|
||
|
if width <= 0 {
|
||
|
flag.Usage()
|
||
|
}
|
||
|
|
||
|
r := bufio.NewReader(os.Stdin)
|
||
|
w := bufio.NewWriter(os.Stdout)
|
||
|
|
||
|
nspace := 0
|
||
|
start := true
|
||
|
|
||
|
flush := func() {
|
||
|
for ; nspace > 0; nspace-- {
|
||
|
err := w.WriteByte(' ')
|
||
|
xcheckf(err, "write")
|
||
|
}
|
||
|
}
|
||
|
write := func(b byte) {
|
||
|
err := w.WriteByte(b)
|
||
|
xcheckf(err, "write")
|
||
|
}
|
||
|
|
||
|
for {
|
||
|
b, err := r.ReadByte()
|
||
|
if err == io.EOF {
|
||
|
break
|
||
|
}
|
||
|
xcheckf(err, "read")
|
||
|
|
||
|
if start && b == ' ' {
|
||
|
nspace++
|
||
|
if nspace == width {
|
||
|
write('\t')
|
||
|
nspace = 0
|
||
|
}
|
||
|
} else {
|
||
|
flush()
|
||
|
write(b)
|
||
|
start = b == '\n'
|
||
|
}
|
||
|
}
|
||
|
flush()
|
||
|
err := w.Flush()
|
||
|
xcheckf(err, "flush output")
|
||
|
}
|