seqdec_generic.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. //go:build !amd64 || appengine || !gc || noasm
  2. package zstd
  3. import (
  4. "fmt"
  5. "io"
  6. )
  7. // decode sequences from the stream with the provided history but without dictionary.
  8. func (s *sequenceDecs) decodeSyncSimple(hist []byte) (bool, error) {
  9. return false, nil
  10. }
  11. // decode sequences from the stream without the provided history.
  12. func (s *sequenceDecs) decode(seqs []seqVals) error {
  13. br := s.br
  14. // Grab full sizes tables, to avoid bounds checks.
  15. llTable, mlTable, ofTable := s.litLengths.fse.dt[:maxTablesize], s.matchLengths.fse.dt[:maxTablesize], s.offsets.fse.dt[:maxTablesize]
  16. llState, mlState, ofState := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state
  17. s.seqSize = 0
  18. litRemain := len(s.literals)
  19. maxBlockSize := maxCompressedBlockSize
  20. if s.windowSize < maxBlockSize {
  21. maxBlockSize = s.windowSize
  22. }
  23. for i := range seqs {
  24. var ll, mo, ml int
  25. if br.cursor > 4+((maxOffsetBits+16+16)>>3) {
  26. // inlined function:
  27. // ll, mo, ml = s.nextFast(br, llState, mlState, ofState)
  28. // Final will not read from stream.
  29. var llB, mlB, moB uint8
  30. ll, llB = llState.final()
  31. ml, mlB = mlState.final()
  32. mo, moB = ofState.final()
  33. // extra bits are stored in reverse order.
  34. br.fillFast()
  35. mo += br.getBits(moB)
  36. if s.maxBits > 32 {
  37. br.fillFast()
  38. }
  39. ml += br.getBits(mlB)
  40. ll += br.getBits(llB)
  41. if moB > 1 {
  42. s.prevOffset[2] = s.prevOffset[1]
  43. s.prevOffset[1] = s.prevOffset[0]
  44. s.prevOffset[0] = mo
  45. } else {
  46. // mo = s.adjustOffset(mo, ll, moB)
  47. // Inlined for rather big speedup
  48. if ll == 0 {
  49. // There is an exception though, when current sequence's literals_length = 0.
  50. // In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2,
  51. // an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte.
  52. mo++
  53. }
  54. if mo == 0 {
  55. mo = s.prevOffset[0]
  56. } else {
  57. var temp int
  58. if mo == 3 {
  59. temp = s.prevOffset[0] - 1
  60. } else {
  61. temp = s.prevOffset[mo]
  62. }
  63. if temp == 0 {
  64. // 0 is not valid; input is corrupted; force offset to 1
  65. println("WARNING: temp was 0")
  66. temp = 1
  67. }
  68. if mo != 1 {
  69. s.prevOffset[2] = s.prevOffset[1]
  70. }
  71. s.prevOffset[1] = s.prevOffset[0]
  72. s.prevOffset[0] = temp
  73. mo = temp
  74. }
  75. }
  76. br.fillFast()
  77. } else {
  78. if br.overread() {
  79. if debugDecoder {
  80. printf("reading sequence %d, exceeded available data\n", i)
  81. }
  82. return io.ErrUnexpectedEOF
  83. }
  84. ll, mo, ml = s.next(br, llState, mlState, ofState)
  85. br.fill()
  86. }
  87. if debugSequences {
  88. println("Seq", i, "Litlen:", ll, "mo:", mo, "(abs) ml:", ml)
  89. }
  90. // Evaluate.
  91. // We might be doing this async, so do it early.
  92. if mo == 0 && ml > 0 {
  93. return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml)
  94. }
  95. if ml > maxMatchLen {
  96. return fmt.Errorf("match len (%d) bigger than max allowed length", ml)
  97. }
  98. s.seqSize += ll + ml
  99. if s.seqSize > maxBlockSize {
  100. return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize)
  101. }
  102. litRemain -= ll
  103. if litRemain < 0 {
  104. return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, litRemain+ll)
  105. }
  106. seqs[i] = seqVals{
  107. ll: ll,
  108. ml: ml,
  109. mo: mo,
  110. }
  111. if i == len(seqs)-1 {
  112. // This is the last sequence, so we shouldn't update state.
  113. break
  114. }
  115. // Manually inlined, ~ 5-20% faster
  116. // Update all 3 states at once. Approx 20% faster.
  117. nBits := llState.nbBits() + mlState.nbBits() + ofState.nbBits()
  118. if nBits == 0 {
  119. llState = llTable[llState.newState()&maxTableMask]
  120. mlState = mlTable[mlState.newState()&maxTableMask]
  121. ofState = ofTable[ofState.newState()&maxTableMask]
  122. } else {
  123. bits := br.get32BitsFast(nBits)
  124. lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31))
  125. llState = llTable[(llState.newState()+lowBits)&maxTableMask]
  126. lowBits = uint16(bits >> (ofState.nbBits() & 31))
  127. lowBits &= bitMask[mlState.nbBits()&15]
  128. mlState = mlTable[(mlState.newState()+lowBits)&maxTableMask]
  129. lowBits = uint16(bits) & bitMask[ofState.nbBits()&15]
  130. ofState = ofTable[(ofState.newState()+lowBits)&maxTableMask]
  131. }
  132. }
  133. s.seqSize += litRemain
  134. if s.seqSize > maxBlockSize {
  135. return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize)
  136. }
  137. err := br.close()
  138. if err != nil {
  139. printf("Closing sequences: %v, %+v\n", err, *br)
  140. }
  141. return err
  142. }
  143. // executeSimple handles cases when a dictionary is not used.
  144. func (s *sequenceDecs) executeSimple(seqs []seqVals, hist []byte) error {
  145. // Ensure we have enough output size...
  146. if len(s.out)+s.seqSize > cap(s.out) {
  147. addBytes := s.seqSize + len(s.out)
  148. s.out = append(s.out, make([]byte, addBytes)...)
  149. s.out = s.out[:len(s.out)-addBytes]
  150. }
  151. if debugDecoder {
  152. printf("Execute %d seqs with literals: %d into %d bytes\n", len(seqs), len(s.literals), s.seqSize)
  153. }
  154. var t = len(s.out)
  155. out := s.out[:t+s.seqSize]
  156. for _, seq := range seqs {
  157. // Add literals
  158. copy(out[t:], s.literals[:seq.ll])
  159. t += seq.ll
  160. s.literals = s.literals[seq.ll:]
  161. // Malformed input
  162. if seq.mo > t+len(hist) || seq.mo > s.windowSize {
  163. return fmt.Errorf("match offset (%d) bigger than current history (%d)", seq.mo, t+len(hist))
  164. }
  165. // Copy from history.
  166. if v := seq.mo - t; v > 0 {
  167. // v is the start position in history from end.
  168. start := len(hist) - v
  169. if seq.ml > v {
  170. // Some goes into the current block.
  171. // Copy remainder of history
  172. copy(out[t:], hist[start:])
  173. t += v
  174. seq.ml -= v
  175. } else {
  176. copy(out[t:], hist[start:start+seq.ml])
  177. t += seq.ml
  178. continue
  179. }
  180. }
  181. // We must be in the current buffer now
  182. if seq.ml > 0 {
  183. start := t - seq.mo
  184. if seq.ml <= t-start {
  185. // No overlap
  186. copy(out[t:], out[start:start+seq.ml])
  187. t += seq.ml
  188. } else {
  189. // Overlapping copy
  190. // Extend destination slice and copy one byte at the time.
  191. src := out[start : start+seq.ml]
  192. dst := out[t:]
  193. dst = dst[:len(src)]
  194. t += len(src)
  195. // Destination is the space we just added.
  196. for i := range src {
  197. dst[i] = src[i]
  198. }
  199. }
  200. }
  201. }
  202. // Add final literals
  203. copy(out[t:], s.literals)
  204. if debugDecoder {
  205. t += len(s.literals)
  206. if t != len(out) {
  207. panic(fmt.Errorf("length mismatch, want %d, got %d, ss: %d", len(out), t, s.seqSize))
  208. }
  209. }
  210. s.out = out
  211. return nil
  212. }