106 lines
2.6 KiB
Go
106 lines
2.6 KiB
Go
|
// Command line utility for the lz4 package.
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
// "bytes"
|
||
|
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"log"
|
||
|
"os"
|
||
|
"path"
|
||
|
"runtime"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/pierrec/lz4"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
// Process command line arguments
|
||
|
var (
|
||
|
blockMaxSizeDefault = 4 << 20
|
||
|
flagStdout = flag.Bool("c", false, "output to stdout")
|
||
|
flagDecompress = flag.Bool("d", false, "decompress flag")
|
||
|
flagBlockMaxSize = flag.Int("B", blockMaxSizeDefault, "block max size [64Kb,256Kb,1Mb,4Mb]")
|
||
|
flagBlockDependency = flag.Bool("BD", false, "enable block dependency")
|
||
|
flagBlockChecksum = flag.Bool("BX", false, "enable block checksum")
|
||
|
flagStreamChecksum = flag.Bool("Sx", false, "disable stream checksum")
|
||
|
flagHighCompression = flag.Bool("9", false, "enabled high compression")
|
||
|
)
|
||
|
flag.Usage = func() {
|
||
|
fmt.Fprintf(os.Stderr, "Usage:\n\t%s [arg] [input]...\n\tNo input means [de]compress stdin to stdout\n\n", os.Args[0])
|
||
|
flag.PrintDefaults()
|
||
|
}
|
||
|
flag.Parse()
|
||
|
|
||
|
// Use all CPUs
|
||
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
||
|
|
||
|
zr := lz4.NewReader(nil)
|
||
|
zw := lz4.NewWriter(nil)
|
||
|
zh := lz4.Header{
|
||
|
BlockDependency: *flagBlockDependency,
|
||
|
BlockChecksum: *flagBlockChecksum,
|
||
|
BlockMaxSize: *flagBlockMaxSize,
|
||
|
NoChecksum: *flagStreamChecksum,
|
||
|
HighCompression: *flagHighCompression,
|
||
|
}
|
||
|
|
||
|
worker := func(in io.Reader, out io.Writer) {
|
||
|
if *flagDecompress {
|
||
|
zr.Reset(in)
|
||
|
if _, err := io.Copy(out, zr); err != nil {
|
||
|
log.Fatalf("Error while decompressing input: %v", err)
|
||
|
}
|
||
|
} else {
|
||
|
zw.Reset(out)
|
||
|
zw.Header = zh
|
||
|
if _, err := io.Copy(zw, in); err != nil {
|
||
|
log.Fatalf("Error while compressing input: %v", err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// No input means [de]compress stdin to stdout
|
||
|
if len(flag.Args()) == 0 {
|
||
|
worker(os.Stdin, os.Stdout)
|
||
|
os.Exit(0)
|
||
|
}
|
||
|
|
||
|
// Compress or decompress all input files
|
||
|
for _, inputFileName := range flag.Args() {
|
||
|
outputFileName := path.Clean(inputFileName)
|
||
|
|
||
|
if !*flagStdout {
|
||
|
if *flagDecompress {
|
||
|
outputFileName = strings.TrimSuffix(outputFileName, lz4.Extension)
|
||
|
if outputFileName == inputFileName {
|
||
|
log.Fatalf("Invalid output file name: same as input: %s", inputFileName)
|
||
|
}
|
||
|
} else {
|
||
|
outputFileName += lz4.Extension
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inputFile, err := os.Open(inputFileName)
|
||
|
if err != nil {
|
||
|
log.Fatalf("Error while opening input: %v", err)
|
||
|
}
|
||
|
|
||
|
outputFile := os.Stdout
|
||
|
if !*flagStdout {
|
||
|
outputFile, err = os.Create(outputFileName)
|
||
|
if err != nil {
|
||
|
log.Fatalf("Error while opening output: %v", err)
|
||
|
}
|
||
|
}
|
||
|
worker(inputFile, outputFile)
|
||
|
|
||
|
inputFile.Close()
|
||
|
if !*flagStdout {
|
||
|
outputFile.Close()
|
||
|
}
|
||
|
}
|
||
|
}
|