package extraio
import (
)
type PadReader struct {
reader io.Reader
blockSize uint8
incomplete int
padding uint8
fillByte byte
}
func ( io.Reader, uint8) *PadReader {
return &PadReader{
reader: ,
blockSize: ,
}
}
func ( *PadReader) () {
.incomplete = 0
.padding = 0
.fillByte = 0
}
func ( *PadReader) ( []byte) (int, error) {
if .fillByte != 0 {
return .pad()
}
, := .reader.Read()
if .blockSize == 0 {
return ,
}
if > 0 {
:= int(.blockSize)
.incomplete += %
.incomplete %=
}
if != io.EOF {
return ,
}
.padding = .blockSize - uint8(.incomplete)
.fillByte = byte(.padding)
, := .pad([:])
return + ,
}
func ( *PadReader) ( []byte) (int, error) {
if .padding == 0 {
return 0, io.EOF
}
var error
:= len()
if := int(.padding); <= {
=
.padding = 0
= io.EOF
} else {
.padding -= uint8()
}
for := 0; < ; ++ {
[] = .fillByte
}
if .padding == 0 {
.Reset()
}
return ,
}