// Copyright 2022 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

pri func decoder.flush_slow?(dst: base.io_writer) {
    var flush_pointer       : base.u32[..= 1_048575]
    var flush_repeat_count  : base.u32[..= 255]
    var flush_prev          : base.u8
    var block_checksum_have : base.u32
    var block_size          : base.u32

    var entry : base.u32
    var curr  : base.u8

    flush_pointer = this.flush_pointer
    flush_repeat_count = this.flush_repeat_count
    flush_prev = this.flush_prev
    block_checksum_have = this.block_checksum_have
    block_size = this.block_size

    while (block_size > 0) and (not coroutine_resumed) {
        if flush_repeat_count < 4 {
            entry = this.bwt[flush_pointer]
            curr = (entry & 0xFF) as base.u8
            flush_pointer = entry >> 12
            if curr == flush_prev {
                flush_repeat_count += 1
            } else {
                flush_repeat_count = 1
            }
            block_checksum_have =
                    REV_CRC32_TABLE[((block_checksum_have >> 24) as base.u8) ^ curr] ^
                    (block_checksum_have ~mod<< 8)
            args.dst.write_u8?(a: curr)
            flush_prev = curr
            block_size -= 1

        } else {
            entry = this.bwt[flush_pointer]
            curr = (entry & 0xFF) as base.u8
            flush_pointer = entry >> 12
            flush_repeat_count = curr as base.u32
            while flush_repeat_count > 0,
                    inv block_size > 0,
            {
                block_checksum_have =
                        REV_CRC32_TABLE[((block_checksum_have >> 24) as base.u8) ^ flush_prev] ^
                        (block_checksum_have ~mod<< 8)
                args.dst.write_u8?(a: flush_prev)
                flush_repeat_count -= 1
            } endwhile
            flush_repeat_count = 0
            flush_prev = curr
            block_size -= 1
        }
    } endwhile

    this.flush_pointer = flush_pointer
    this.flush_repeat_count = flush_repeat_count
    this.flush_prev = flush_prev
    this.block_checksum_have = block_checksum_have
    if block_size <= 900000 {
        this.block_size = block_size
    }
}
