Skip to content

Instantly share code, notes, and snippets.

@rjeczalik
Created May 22, 2014 13:37
Show Gist options
  • Save rjeczalik/bf4f8a9ce5e2bf9185dd to your computer and use it in GitHub Desktop.
Save rjeczalik/bf4f8a9ce5e2bf9185dd to your computer and use it in GitHub Desktop.
Command line interface to compress/* packages.
package main
import (
"compress/flate"
"compress/gzip"
"compress/lzw"
"compress/zlib"
"fmt"
"io"
"os"
"strings"
)
type action uint8
const (
Flate action = iota
Gzip
Lzw
Zlib
)
func die(v ...interface{}) {
fmt.Fprintln(os.Stderr, v...)
os.Exit(1)
}
func dieusage() {
die("gocompress TYPE FILE")
}
func parse() (a action, compress bool, in, out string) {
if len(os.Args) != 3 {
dieusage()
}
in, out = os.Args[2], os.Args[2]
var ext string
switch strings.ToLower(os.Args[1]) {
case "flate":
a, ext = Flate, ".flate"
case "gzip":
a, ext = Gzip, ".gz"
case "lzw":
a, ext = Lzw, ".lzw"
case "zlib":
a, ext = Zlib, ".z"
default:
die(os.Args[1], "is not supported")
os.Exit(1)
}
if !strings.HasSuffix(in, ext) {
compress = true
out = in + ext
} else {
out = out[:len(out)-len(ext)]
}
return
}
func main() {
a, compress, in, out := parse()
r, err := os.Open(in)
if err != nil {
die(err)
}
defer r.Close()
w, err := os.OpenFile(out, os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
die(err)
}
defer w.Close()
switch a {
case Flate:
if compress {
cw, err := flate.NewWriter(w, flate.BestCompression)
if err != nil {
die(err)
}
defer cw.Close()
if _, err = io.Copy(cw, r); err != nil {
die(err)
}
} else {
cr := flate.NewReader(r)
defer cr.Close()
if _, err = io.Copy(w, cr); err != nil {
die(err)
}
}
case Gzip:
if compress {
cw, err := gzip.NewWriterLevel(w, gzip.BestCompression)
if err != nil {
die(err)
}
defer cw.Close()
if _, err = io.Copy(cw, r); err != nil {
die(err)
}
} else {
cr, err := gzip.NewReader(r)
if err != nil {
die(err)
}
defer cr.Close()
if _, err = io.Copy(w, cr); err != nil {
die(err)
}
}
case Lzw:
if compress {
cw := lzw.NewWriter(w, lzw.LSB, 8)
defer cw.Close()
if _, err = io.Copy(cw, r); err != nil {
die(err)
}
} else {
cr := lzw.NewReader(r, lzw.LSB, 8)
defer cr.Close()
if _, err = io.Copy(w, cr); err != nil {
die(err)
}
}
case Zlib:
if compress {
cw, err := zlib.NewWriterLevel(w, zlib.BestCompression)
if err != nil {
die(err)
}
defer cw.Close()
if _, err = io.Copy(cw, r); err != nil {
die(err)
}
} else {
cr, err := zlib.NewReader(r)
if err != nil {
die(err)
}
defer cr.Close()
if _, err = io.Copy(w, cr); err != nil {
die(err)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment