Index: src/0dev.org/commands/mtf/main.go ================================================================== --- src/0dev.org/commands/mtf/main.go +++ src/0dev.org/commands/mtf/main.go @@ -1,58 +1,44 @@ package main import ( + fib "0dev.org/encoding/fibonacci" mtf "0dev.org/encoding/mtf" iou "0dev.org/ioutil" "flag" - "fmt" "io" "os" ) func main() { - d := flag.Bool("d", false, "Use to toggle decode mode") - flag.Parse() - - var code int - if *d { - code = decode(os.Stdout, os.Stdin) - } else { - code = encode(os.Stdout, os.Stdin) - } - - os.Exit(code) -} - -// Transforms the data according to the move-to-front algorithm -// I/O is buffered for better performance -func encode(output io.Writer, input io.Reader) int { - var ( - err error - encoder io.Reader = mtf.Encoder(iou.SizedReader(input, 4096)) - ) - - _, err = io.Copy(output, encoder) - if err != nil { - fmt.Fprintln(os.Stderr, "Error while encoding.\n", err) - return 1 - } - - return 0 -} - -// Reverses MTF`ed data and writes back the original bytes -// I/O is buffered for better performance -func decode(output io.Writer, input io.Reader) int { - var ( - err error - decoder io.Reader = mtf.Decoder(iou.SizedReader(input, 4096)) - ) - - _, err = io.Copy(output, decoder) - if err != nil { - fmt.Fprintln(os.Stderr, "Error while decoding.\n", err) - return 1 - } - - return 0 + d := flag.Bool("d", false, "Toggle decode mode.") + flag.Parse() + + var ( + input io.Reader = iou.SizedReader(os.Stdin, 4096) + output io.Writer = iou.SizedWriter(os.Stdout, 4096) + code int + ) + + // Exit handler + defer func() { + os.Exit(code) + }() + + // Flush the output buffer + defer output.Write(nil) + + if *d { + input = mtf.Decoder(fib.Decoder(input)) + } else { + input = mtf.Encoder(input) + + // Encode output as fibonacci integers + output = fib.Encoder(output) + defer output.Write(nil) + } + + if _, err := io.Copy(output, input); err != nil { + os.Stderr.WriteString("Error while transforming data.\n" + err.Error()) + code = 1 + } } Index: src/0dev.org/encoding/mtf/mtf_test.go ================================================================== --- src/0dev.org/encoding/mtf/mtf_test.go +++ src/0dev.org/encoding/mtf/mtf_test.go @@ -25,58 +25,5 @@ EqualFunc: func(i, j int) bool { return data[i] == processed[j] }}) if len(delta.Added) > 0 || len(delta.Removed) > 0 { t.Error("Differences detected ", delta) } } - -// func TestEncoder(t *testing.T) { -// var ( -// input []byte = []byte{1, 1, 0, 0} -// expected []byte = []byte{1, 0, 1, 0} - -// buffer bytes.Buffer -// encoder io.Writer = Encoder(&buffer) -// ) - -// count, err := encoder.Write(input) -// if count != len(input) { -// t.Error("Unexpected write count from encoder", count) -// } -// if err != nil { -// t.Error("Unexpected write error from encoder", err) -// } - -// output := buffer.Bytes() - -// // Diff the output against the expected result -// delta := diff.Diff(diff.D{Len1: len(expected), Len2: len(output), -// EqualFunc: func(i, j int) bool { return expected[i] == output[j] }}) -// if len(delta.Added) > 0 || len(delta.Removed) > 0 { -// t.Error("Differences detected ", delta) -// } -// } - -// func TestDecoder(t *testing.T) { -// var ( -// input []byte = []byte{1, 0, 1, 0} -// expected []byte = []byte{1, 1, 0, 0} -// output []byte = make([]byte, 4) - -// reader *bytes.Reader = bytes.NewReader(input) -// decoder io.Reader = Decoder(reader) -// ) - -// count, err := decoder.Read(output) -// if count != len(output) { -// t.Error("Unexpected read count from decoder", count) -// } -// if err != nil { -// t.Error("Unexpected read error from decoder", err) -// } - -// // Diff the output against the expected result -// delta := diff.Diff(diff.D{Len1: len(expected), Len2: len(output), -// EqualFunc: func(i, j int) bool { return expected[i] == output[j] }}) -// if len(delta.Added) > 0 || len(delta.Removed) > 0 { -// t.Error("Differences detected ", delta) -// } -// }