@@ -388,46 +388,38 @@ func (r *Reader) copyFromWindow(rbr *reverseBitReader, offset, match uint32) err
388
388
return rbr .makeError ("invalid zero offset" )
389
389
}
390
390
391
+ // Offset may point into the buffer or the window and
392
+ // match may extend past the end of the initial buffer.
393
+ // |--r.window--|--r.buffer--|
394
+ // |<-----offset------|
395
+ // |------match----------->|
396
+ bufferOffset := uint32 (0 )
391
397
lenBlock := uint32 (len (r .buffer ))
392
398
if lenBlock < offset {
393
399
lenWindow := r .window .len ()
394
- windowOffset := offset - lenBlock
395
- if windowOffset > lenWindow {
400
+ copy := offset - lenBlock
401
+ if copy > lenWindow {
396
402
return rbr .makeError ("offset past window" )
397
403
}
398
- from := lenWindow - windowOffset
399
- if from + match <= lenWindow {
400
- r .buffer = r .window .appendTo (r .buffer , from , from + match )
401
- return nil
402
- }
403
- r .buffer = r .window .appendTo (r .buffer , from , lenWindow )
404
- copied := lenWindow - from
405
- offset -= copied
406
- match -= copied
407
-
408
- if offset == 0 && match > 0 {
409
- return rbr .makeError ("invalid offset" )
404
+ windowOffset := lenWindow - copy
405
+ if copy > match {
406
+ copy = match
410
407
}
411
- }
412
-
413
- from := lenBlock - offset
414
- if offset >= match {
415
- r .buffer = append (r .buffer , r .buffer [from :from + match ]... )
416
- return nil
408
+ r .buffer = r .window .appendTo (r .buffer , windowOffset , windowOffset + copy )
409
+ match -= copy
410
+ } else {
411
+ bufferOffset = lenBlock - offset
417
412
}
418
413
419
414
// We are being asked to copy data that we are adding to the
420
415
// buffer in the same copy.
421
416
for match > 0 {
422
- var copy uint32
423
- if offset >= match {
417
+ copy := uint32 ( len ( r . buffer )) - bufferOffset
418
+ if copy > match {
424
419
copy = match
425
- } else {
426
- copy = offset
427
420
}
428
- r .buffer = append (r .buffer , r .buffer [from : from + copy ]... )
421
+ r .buffer = append (r .buffer , r .buffer [bufferOffset : bufferOffset + copy ]... )
429
422
match -= copy
430
- from += copy
431
423
}
432
424
return nil
433
425
}
0 commit comments