Overview
| Comment: | Implemented commands/pdc using predictor. Made predictor's Compressor(...) return an io.Writer. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
c9f3a59cb6f8359e28b9333fb4f6a661 |
| User & Date: | spaskalev on 2014-12-19 21:54:39.534 |
| Other Links: | manifest | tags |
Context
|
2014-12-20
| ||
| 11:52 | [predictor] Removed the buffer from the context struct, allocate the input slice buffer on creation with make. check-in: 723ffeb1fd user: spaskalev tags: trunk | |
|
2014-12-19
| ||
| 21:54 | Implemented commands/pdc using predictor. Made predictor's Compressor(...) return an io.Writer. check-in: c9f3a59cb6 user: spaskalev tags: trunk | |
|
2014-12-16
| ||
| 23:29 | Removed err variable from compressor check-in: 0f4bc650d1 user: spaskalev tags: trunk | |
Changes
Added src/0dev.org/commands/pdc/main.go version [3c0c8016e1].
Modified src/0dev.org/commands/plaindiff/main.go
from [f98671241a]
to [b2d6e402f0].
1 2 3 4 5 6 7 8 9 10 11 12 | package main import ( diff "0dev.org/diff" "bufio" "fmt" "hash" "hash/fnv" "io" "os" ) | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package main
import (
diff "0dev.org/diff"
"bufio"
"fmt"
"hash"
"hash/fnv"
"io"
"os"
)
const usage = "Usage: plaindiff <file1> <file2>\n"
func main() {
var args []string = os.Args
if len(args) != 3 {
os.Stderr.WriteString(usage)
os.Exit(1)
}
|
| ︙ | ︙ |
Modified src/0dev.org/predictor/predictor.go
from [2cc1907fb9]
to [c65cc5c256].
| ︙ | ︙ | |||
9 10 11 12 13 14 15 |
type context struct {
table [1 << 16]byte
buffer [1 << 3]byte
input []byte
hash uint16
}
| > | > > > > > > | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
type context struct {
table [1 << 16]byte
buffer [1 << 3]byte
input []byte
hash uint16
}
type compressor func([]byte) error
func (w compressor) Write(data []byte) (int, error) {
return len(data), w(data)
}
// Returns an io.Writer implementation that wraps the provided io.Writer
// and compresses data according to the predictor algorithm
//
// It can buffer data as the predictor mandates 8-byte blocks with a header.
// A call with no data will force a flush.
func Compressor(writer io.Writer) io.Writer {
var ctx context
ctx.input = ctx.buffer[:0]
// Forward declaration as it is required for recursion
var write compressor
write = func(data []byte) error {
var (
blockSize int = 8
bufferLength int = len(ctx.input)
)
|
| ︙ | ︙ | |||
99 100 101 102 103 104 105 | return nil } return write } | > | > | | > | | 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
return nil
}
return write
}
// A function type alias so that it can have methods attached to it
type decompressor func([]byte) (int, error)
// Required to implement io.Reader
func (r decompressor) Read(output []byte) (int, error) {
return r(output)
}
// Returns an io.Reader implementation that wraps the provided io.Reader
// and decompresses data according to the predictor algorithm
func Decompressor(wrapped io.Reader) io.Reader {
var ctx context
ctx.input = ctx.buffer[:0]
return decompressor(func(output []byte) (int, error) {
var (
err error
flags byte
readCount int
)
// Sanity check for space to read into
|
| ︙ | ︙ |
Modified src/0dev.org/predictor/predictor_test.go
from [73a8f932ed]
to [dd11cf49de].
| ︙ | ︙ | |||
27 28 29 30 31 32 33 |
func TestCompressorSample(t *testing.T) {
var (
buf bytes.Buffer
err error
)
out := Compressor(&buf)
| | | | 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
func TestCompressorSample(t *testing.T) {
var (
buf bytes.Buffer
err error
)
out := Compressor(&buf)
_, err = out.Write(input)
if err != nil {
t.Error(err)
}
_, err = out.Write(nil)
if err != nil {
t.Error(err)
}
result := buf.Bytes()
delta := diff.Diff(diff.D{len(result), len(output), func(i, j int) bool { return result[i] == output[j] }})
|
| ︙ | ︙ | |||
107 108 109 110 111 112 113 |
var trace []byte = make([]byte, 0)
for len(data) > 0 {
if step <= len(data) {
trace = append(trace, data[:step]...)
| | | | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
var trace []byte = make([]byte, 0)
for len(data) > 0 {
if step <= len(data) {
trace = append(trace, data[:step]...)
_, err = compressor.Write(data[:step])
if err != nil {
return err
}
data = data[step:]
} else {
step = len(data)
}
}
// Flush the compressor
_, err = compressor.Write(nil)
if err != nil {
return err
}
// Attempt to decompress the data
compressed := buf.Bytes()
decompressed, err := ioutil.ReadAll(Decompressor(bytes.NewReader(compressed)))
|
| ︙ | ︙ |