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
5package lzma
6
7import (
8	"errors"
9	"io"
10)
11
12// rangeEncoder implements range encoding of single bits. The low value can
13// overflow therefore we need uint64. The cache value is used to handle
14// overflows.
15type rangeEncoder struct {
16	lbw      *LimitedByteWriter
17	nrange   uint32
18	low      uint64
19	cacheLen int64
20	cache    byte
21}
22
23// maxInt64 provides the  maximal value of the int64 type
24const maxInt64 = 1<<63 - 1
25
26// newRangeEncoder creates a new range encoder.
27func newRangeEncoder(bw io.ByteWriter) (re *rangeEncoder, err error) {
28	lbw, ok := bw.(*LimitedByteWriter)
29	if !ok {
30		lbw = &LimitedByteWriter{BW: bw, N: maxInt64}
31	}
32	return &rangeEncoder{
33		lbw:      lbw,
34		nrange:   0xffffffff,
35		cacheLen: 1}, nil
36}
37
38// Available returns the number of bytes that still can be written. The
39// method takes the bytes that will be currently written by Close into
40// account.
41func (e *rangeEncoder) Available() int64 {
42	return e.lbw.N - (e.cacheLen + 4)
43}
44
45// writeByte writes a single byte to the underlying writer. An error is
46// returned if the limit is reached. The written byte will be counted if
47// the underlying writer doesn't return an error.
48func (e *rangeEncoder) writeByte(c byte) error {
49	if e.Available() < 1 {
50		return ErrLimit
51	}
52	return e.lbw.WriteByte(c)
53}
54
55// DirectEncodeBit encodes the least-significant bit of b with probability 1/2.
56func (e *rangeEncoder) DirectEncodeBit(b uint32) error {
57	e.nrange >>= 1
58	e.low += uint64(e.nrange) & (0 - (uint64(b) & 1))
59
60	// normalize
61	const top = 1 << 24
62	if e.nrange >= top {
63		return nil
64	}
65	e.nrange <<= 8
66	return e.shiftLow()
67}
68
69// EncodeBit encodes the least significant bit of b. The p value will be
70// updated by the function depending on the bit encoded.
71func (e *rangeEncoder) EncodeBit(b uint32, p *prob) error {
72	bound := p.bound(e.nrange)
73	if b&1 == 0 {
74		e.nrange = bound
75		p.inc()
76	} else {
77		e.low += uint64(bound)
78		e.nrange -= bound
79		p.dec()
80	}
81
82	// normalize
83	const top = 1 << 24
84	if e.nrange >= top {
85		return nil
86	}
87	e.nrange <<= 8
88	return e.shiftLow()
89}
90
91// Close writes a complete copy of the low value.
92func (e *rangeEncoder) Close() error {
93	for i := 0; i < 5; i++ {
94		if err := e.shiftLow(); err != nil {
95			return err
96		}
97	}
98	return nil
99}
100
101// shiftLow shifts the low value for 8 bit. The shifted byte is written into
102// the byte writer. The cache value is used to handle overflows.
103func (e *rangeEncoder) shiftLow() error {
104	if uint32(e.low) < 0xff000000 || (e.low>>32) != 0 {
105		tmp := e.cache
106		for {
107			err := e.writeByte(tmp + byte(e.low>>32))
108			if err != nil {
109				return err
110			}
111			tmp = 0xff
112			e.cacheLen--
113			if e.cacheLen <= 0 {
114				if e.cacheLen < 0 {
115					panic("negative cacheLen")
116				}
117				break
118			}
119		}
120		e.cache = byte(uint32(e.low) >> 24)
121	}
122	e.cacheLen++
123	e.low = uint64(uint32(e.low) << 8)
124	return nil
125}
126
127// rangeDecoder decodes single bits of the range encoding stream.
128type rangeDecoder struct {
129	br     io.ByteReader
130	nrange uint32
131	code   uint32
132}
133
134// init initializes the range decoder, by reading from the byte reader.
135func (d *rangeDecoder) init() error {
136	d.nrange = 0xffffffff
137	d.code = 0
138
139	b, err := d.br.ReadByte()
140	if err != nil {
141		return err
142	}
143	if b != 0 {
144		return errors.New("newRangeDecoder: first byte not zero")
145	}
146
147	for i := 0; i < 4; i++ {
148		if err = d.updateCode(); err != nil {
149			return err
150		}
151	}
152
153	if d.code >= d.nrange {
154		return errors.New("newRangeDecoder: d.code >= d.nrange")
155	}
156
157	return nil
158}
159
160// newRangeDecoder initializes a range decoder. It reads five bytes from the
161// reader and therefore may return an error.
162func newRangeDecoder(br io.ByteReader) (d *rangeDecoder, err error) {
163	d = &rangeDecoder{br: br, nrange: 0xffffffff}
164
165	b, err := d.br.ReadByte()
166	if err != nil {
167		return nil, err
168	}
169	if b != 0 {
170		return nil, errors.New("newRangeDecoder: first byte not zero")
171	}
172
173	for i := 0; i < 4; i++ {
174		if err = d.updateCode(); err != nil {
175			return nil, err
176		}
177	}
178
179	if d.code >= d.nrange {
180		return nil, errors.New("newRangeDecoder: d.code >= d.nrange")
181	}
182
183	return d, nil
184}
185
186// possiblyAtEnd checks whether the decoder may be at the end of the stream.
187func (d *rangeDecoder) possiblyAtEnd() bool {
188	return d.code == 0
189}
190
191// DirectDecodeBit decodes a bit with probability 1/2. The return value b will
192// contain the bit at the least-significant position. All other bits will be
193// zero.
194func (d *rangeDecoder) DirectDecodeBit() (b uint32, err error) {
195	d.nrange >>= 1
196	d.code -= d.nrange
197	t := 0 - (d.code >> 31)
198	d.code += d.nrange & t
199	b = (t + 1) & 1
200
201	// d.code will stay less then d.nrange
202
203	// normalize
204	// assume d.code < d.nrange
205	const top = 1 << 24
206	if d.nrange >= top {
207		return b, nil
208	}
209	d.nrange <<= 8
210	// d.code < d.nrange will be maintained
211	return b, d.updateCode()
212}
213
214// decodeBit decodes a single bit. The bit will be returned at the
215// least-significant position. All other bits will be zero. The probability
216// value will be updated.
217func (d *rangeDecoder) DecodeBit(p *prob) (b uint32, err error) {
218	bound := p.bound(d.nrange)
219	if d.code < bound {
220		d.nrange = bound
221		p.inc()
222		b = 0
223	} else {
224		d.code -= bound
225		d.nrange -= bound
226		p.dec()
227		b = 1
228	}
229	// normalize
230	// assume d.code < d.nrange
231	const top = 1 << 24
232	if d.nrange >= top {
233		return b, nil
234	}
235	d.nrange <<= 8
236	// d.code < d.nrange will be maintained
237	return b, d.updateCode()
238}
239
240// updateCode reads a new byte into the code.
241func (d *rangeDecoder) updateCode() error {
242	b, err := d.br.ReadByte()
243	if err != nil {
244		return err
245	}
246	d.code = (d.code << 8) | uint32(b)
247	return nil
248}
249