diff options
Diffstat (limited to 'vendor/github.com/ulikunitz/xz/lzma/operation.go')
-rw-r--r-- | vendor/github.com/ulikunitz/xz/lzma/operation.go | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/vendor/github.com/ulikunitz/xz/lzma/operation.go b/vendor/github.com/ulikunitz/xz/lzma/operation.go new file mode 100644 index 0000000..733bb99 --- /dev/null +++ b/vendor/github.com/ulikunitz/xz/lzma/operation.go | |||
@@ -0,0 +1,80 @@ | |||
1 | // Copyright 2014-2017 Ulrich Kunitz. All rights reserved. | ||
2 | // Use of this source code is governed by a BSD-style | ||
3 | // license that can be found in the LICENSE file. | ||
4 | |||
5 | package lzma | ||
6 | |||
7 | import ( | ||
8 | "errors" | ||
9 | "fmt" | ||
10 | "unicode" | ||
11 | ) | ||
12 | |||
13 | // operation represents an operation on the dictionary during encoding or | ||
14 | // decoding. | ||
15 | type operation interface { | ||
16 | Len() int | ||
17 | } | ||
18 | |||
19 | // rep represents a repetition at the given distance and the given length | ||
20 | type match struct { | ||
21 | // supports all possible distance values, including the eos marker | ||
22 | distance int64 | ||
23 | // length | ||
24 | n int | ||
25 | } | ||
26 | |||
27 | // verify checks whether the match is valid. If that is not the case an | ||
28 | // error is returned. | ||
29 | func (m match) verify() error { | ||
30 | if !(minDistance <= m.distance && m.distance <= maxDistance) { | ||
31 | return errors.New("distance out of range") | ||
32 | } | ||
33 | if !(1 <= m.n && m.n <= maxMatchLen) { | ||
34 | return errors.New("length out of range") | ||
35 | } | ||
36 | return nil | ||
37 | } | ||
38 | |||
39 | // l return the l-value for the match, which is the difference of length | ||
40 | // n and 2. | ||
41 | func (m match) l() uint32 { | ||
42 | return uint32(m.n - minMatchLen) | ||
43 | } | ||
44 | |||
45 | // dist returns the dist value for the match, which is one less of the | ||
46 | // distance stored in the match. | ||
47 | func (m match) dist() uint32 { | ||
48 | return uint32(m.distance - minDistance) | ||
49 | } | ||
50 | |||
51 | // Len returns the number of bytes matched. | ||
52 | func (m match) Len() int { | ||
53 | return m.n | ||
54 | } | ||
55 | |||
56 | // String returns a string representation for the repetition. | ||
57 | func (m match) String() string { | ||
58 | return fmt.Sprintf("M{%d,%d}", m.distance, m.n) | ||
59 | } | ||
60 | |||
61 | // lit represents a single byte literal. | ||
62 | type lit struct { | ||
63 | b byte | ||
64 | } | ||
65 | |||
66 | // Len returns 1 for the single byte literal. | ||
67 | func (l lit) Len() int { | ||
68 | return 1 | ||
69 | } | ||
70 | |||
71 | // String returns a string representation for the literal. | ||
72 | func (l lit) String() string { | ||
73 | var c byte | ||
74 | if unicode.IsPrint(rune(l.b)) { | ||
75 | c = l.b | ||
76 | } else { | ||
77 | c = '.' | ||
78 | } | ||
79 | return fmt.Sprintf("L{%c/%02x}", c, l.b) | ||
80 | } | ||