// Copyright 2018 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.

//go:build ignore
// +build ignore

package main

// make-artificial.go makes test data in various formats.
//
// See test/data/artificial/*.make.txt for examples.
//
// Usage: go run make-artificial.go < foo.make.txt

import (
	"bytes"
	"compress/lzw"
	"compress/zlib"
	"fmt"
	"hash/crc32"
	"io"
	"os"
	"strconv"
	"strings"
)

type stateFunc func(line string) (stateFunc, error)

type repeat struct {
	count     uint32
	remaining string
}

var (
	state   stateFunc
	repeats []repeat
	out     []byte
	formats = map[string]stateFunc{}
)

func main() {
	if err := main1(); err != nil {
		os.Stderr.WriteString(err.Error() + "\n")
		os.Exit(1)
	}
}

func main1() error {
	stdin, err := io.ReadAll(os.Stdin)
	if err != nil {
		return err
	}
	s := string(stdin)
	for remaining := ""; len(s) > 0; s, remaining = remaining, "" {
		if i := strings.IndexByte(s, '\n'); i >= 0 {
			s, remaining = s[:i], s[i+1:]
		}
		s = strings.TrimSpace(s)
		if s == "" || s[0] == '#' {
			continue
		}

		if state == nil {
			const m = "make "
			if !strings.HasPrefix(s, m) {
				return fmt.Errorf(`input must start with "make foo"`)
			}
			s = s[len(m):]
			state = formats[s]
			if state == nil {
				return fmt.Errorf("unsupported format %q", s)
			}
			continue
		}

		const rep = "repeat "
		if strings.HasPrefix(s, rep) {
			args := s[len(rep):]
			count, args, ok := parseNum(args)
			if !ok || count <= 0 || args != "[" {
				return fmt.Errorf("bad repeat command: %q", s)
			}
			repeats = append(repeats, repeat{
				count:     count,
				remaining: remaining,
			})
			continue
		}

		if s == "]" {
			if len(repeats) <= 0 {
				return fmt.Errorf(`unbalanced close-repeat command: "]"`)
			}
			i := len(repeats) - 1
			repeats[i].count--
			if repeats[i].count == 0 {
				repeats = repeats[:i]
			} else {
				remaining = repeats[i].remaining
			}
			continue
		}

		state, err = state(s)
		if err != nil {
			return err
		}
		if state == nil {
			return fmt.Errorf("bad state transition")
		}
	}

	if state == nil {
		return fmt.Errorf("no 'make' line")
	} else {
		state, err = state("")
		if err != nil {
			return err
		}
	}

	_, err = os.Stdout.Write(out)
	return err
}

// ----

func appendU16LE(b []byte, u uint16) []byte {
	return append(b, uint8(u), uint8(u>>8))
}

func appendU32BE(b []byte, u uint32) []byte {
	return append(b, uint8(u>>24), uint8(u>>16), uint8(u>>8), uint8(u))
}

func log2(u uint32) (i int32) {
	for i, pow := uint32(0), uint32(1); i < 32; i, pow = i+1, pow<<1 {
		if u == pow {
			return int32(i)
		}
		if u < pow {
			break
		}
	}
	return -1
}

func parseHex(s string) (num uint32, remaining string, ok bool) {
	if i := strings.IndexByte(s, ' '); i >= 0 {
		s, remaining = s[:i], s[i+1:]
		for len(remaining) > 0 && remaining[0] == ' ' {
			remaining = remaining[1:]
		}
	}

	if len(s) < 2 || s[0] != '0' || s[1] != 'x' {
		return 0, "", false
	}
	s = s[2:]

	u, err := strconv.ParseUint(s, 16, 32)
	if err != nil {
		return 0, "", false
	}
	return uint32(u), remaining, true
}

func parseNum(s string) (num uint32, remaining string, ok bool) {
	if i := strings.IndexByte(s, ' '); i >= 0 {
		s, remaining = s[:i], s[i+1:]
		for len(remaining) > 0 && remaining[0] == ' ' {
			remaining = remaining[1:]
		}
	}

	u, err := strconv.ParseUint(s, 10, 32)
	if err != nil {
		return 0, "", false
	}
	return uint32(u), remaining, true
}

func reverse(x uint32, n uint32) uint32 {
	x = uint32(reverse8[0xFF&(x>>0)])<<24 |
		uint32(reverse8[0xFF&(x>>8)])<<16 |
		uint32(reverse8[0xFF&(x>>16)])<<8 |
		uint32(reverse8[0xFF&(x>>24)])<<0
	return x >> (32 - n)
}

var reverse8 = [256]byte{
	0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, // 0x00 - 0x07
	0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, // 0x08 - 0x0F
	0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, // 0x10 - 0x17
	0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, // 0x18 - 0x1F
	0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, // 0x20 - 0x27
	0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, // 0x28 - 0x2F
	0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, // 0x30 - 0x37
	0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, // 0x38 - 0x3F
	0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, // 0x40 - 0x47
	0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, // 0x48 - 0x4F
	0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, // 0x50 - 0x57
	0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, // 0x58 - 0x5F
	0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, // 0x60 - 0x67
	0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, // 0x68 - 0x6F
	0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, // 0x70 - 0x77
	0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, // 0x78 - 0x7F
	0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, // 0x80 - 0x87
	0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, // 0x88 - 0x8F
	0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, // 0x90 - 0x97
	0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, // 0x98 - 0x9F
	0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, // 0xA0 - 0xA7
	0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, // 0xA8 - 0xAF
	0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, // 0xB0 - 0xB7
	0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, // 0xB8 - 0xBF
	0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, // 0xC0 - 0xC7
	0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, // 0xC8 - 0xCF
	0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, // 0xD0 - 0xD7
	0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, // 0xD8 - 0xDF
	0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, // 0xE0 - 0xE7
	0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, // 0xE8 - 0xEF
	0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, // 0xF0 - 0xF7
	0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF, // 0xF8 - 0xFF
}

// ----

func init() {
	formats["deflate"] = stateDeflate
}

var deflateCodeOrder = [19]uint32{
	16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15,
}

type deflateHuffmanTable map[uint32]string

var deflateGlobals struct {
	bncData []byte
	stream  deflateBitStream

	// Dynamic Huffman state.
	whichHuffman uint32
	// 0=Unused, 1=CodeLength, 2=Literal/Length, 3=Distance.
	huffmans [4]deflateHuffmanTable

	// DHH (Dynamic Huffman, inside a Huffman table) state.
	prevLine string
	etcetera bool
}

func deflateGlobalsClearDynamicHuffmanState() {
	deflateGlobals.whichHuffman = 0
	deflateGlobals.huffmans = [4]deflateHuffmanTable{}
	deflateGlobals.prevLine = ""
	deflateGlobals.etcetera = false
}

func deflateGlobalsCountCodes() (numLCodes uint32, numDCodes uint32, numCLCodeLengths uint32, retErr error) {
	for k := range deflateGlobals.huffmans[2] {
		if numLCodes < (k + 1) {
			numLCodes = (k + 1)
		}
	}

	for k := range deflateGlobals.huffmans[3] {
		if numDCodes < (k + 1) {
			numDCodes = (k + 1)
		}
	}

	for k := range deflateGlobals.huffmans[1] {
		if (k < 0) || (18 < k) {
			return 0, 0, 0, fmt.Errorf("bad CodeLength: %d", k)
		}
	}
	for i := len(deflateCodeOrder) - 1; i >= 0; i-- {
		cl := deflateCodeOrder[i]
		if _, ok := deflateGlobals.huffmans[1][cl]; ok {
			numCLCodeLengths = uint32(i + 1)
			break
		}
	}
	if numCLCodeLengths < 4 {
		numCLCodeLengths = 4
	}

	return numLCodes, numDCodes, numCLCodeLengths, nil
}

func deflateGlobalsWriteDynamicHuffmanTables() error {
	g := &deflateGlobals
	numLCodes, numDCodes, numCLCodeLengths, err := deflateGlobalsCountCodes()
	if err != nil {
		return err
	}
	if (numLCodes < 257) || (257+31 < numLCodes) {
		return fmt.Errorf("bad numLCodes: %d", numLCodes)
	}
	g.stream.writeBits(numLCodes-257, 5)
	if (numDCodes < 1) || (1+31 < numDCodes) {
		return fmt.Errorf("bad numDCodes: %d", numDCodes)
	}
	g.stream.writeBits(numDCodes-1, 5)
	if (numCLCodeLengths < 4) || (4+15 < numCLCodeLengths) {
		return fmt.Errorf("bad numCLCodeLengths: %d", numCLCodeLengths)
	}
	g.stream.writeBits(numCLCodeLengths-4, 4)

	// Write the Huffman table for CodeLength.
	{
		for i := uint32(0); i < numCLCodeLengths; i++ {
			n := len(g.huffmans[1][deflateCodeOrder[i]])
			g.stream.writeBits(uint32(n), 3)
		}
		for i := numCLCodeLengths; i < uint32(len(deflateCodeOrder)); i++ {
			n := len(g.huffmans[1][deflateCodeOrder[i]])
			if n > 0 {
				return fmt.Errorf("short numCLCodeLengths: %d", numCLCodeLengths)
			}
		}
	}

	// Write the Huffman tables for Literal/Length and Distance.
	{
		numZeroes := uint32(0)
		for i := uint32(0); i < numLCodes+numDCodes; i++ {
			codeLen := uint32(0)
			if i < numLCodes {
				codeLen = uint32(len(g.huffmans[2][i]))
			} else {
				codeLen = uint32(len(g.huffmans[3][i-numLCodes]))
			}
			if codeLen == 0 {
				numZeroes++
				continue
			}

			if err := deflateGlobalsWriteDynamicHuffmanZeroes(numZeroes); err != nil {
				return err
			}
			numZeroes = 0

			codeLenCode := g.huffmans[1][codeLen]
			if codeLenCode == "" {
				return fmt.Errorf("no code for code-length %d", codeLen)
			}
			deflateGlobalsWriteDynamicHuffmanBits(g.huffmans[1][codeLen])
		}
		if err := deflateGlobalsWriteDynamicHuffmanZeroes(numZeroes); err != nil {
			return err
		}
	}

	return nil
}

func deflateGlobalsWriteDynamicHuffmanZeroes(numZeroes uint32) error {
	g := &deflateGlobals
	if numZeroes == 0 {
		return nil
	}

	if s := g.huffmans[1][18]; s != "" {
		for numZeroes >= 11 {
			extra := numZeroes - 11
			if extra > 127 {
				extra = 127
			}
			deflateGlobalsWriteDynamicHuffmanBits(s)
			g.stream.writeBits(extra, 7)
			numZeroes -= 11 + extra
		}
	}

	if s := g.huffmans[1][17]; s != "" {
		for numZeroes >= 3 {
			extra := numZeroes - 3
			if extra > 7 {
				extra = 7
			}
			deflateGlobalsWriteDynamicHuffmanBits(s)
			g.stream.writeBits(extra, 3)
			numZeroes -= 3 + extra
		}
	}

	if s := g.huffmans[1][0]; s != "" {
		for ; numZeroes > 0; numZeroes-- {
			deflateGlobalsWriteDynamicHuffmanBits(s)
		}
	}

	if numZeroes > 0 {
		return fmt.Errorf("could not write a run of zero-valued code lengths")
	}
	return nil
}

func deflateGlobalsWriteDynamicHuffmanBits(s string) {
	g := &deflateGlobals
	for i := 0; i < len(s); i++ {
		g.stream.writeBits(uint32(s[i]&1), 1)
	}
}

func parseDeflateWhichHuffman(s string) (num uint32, remaining string, ok bool) {
	if i := strings.IndexByte(s, ' '); i >= 0 {
		s, remaining = s[:i], s[i+1:]
		for len(remaining) > 0 && remaining[0] == ' ' {
			remaining = remaining[1:]
		}
	}

	switch s {
	case "CodeLength":
		return 1, remaining, true
	case "Literal/Length":
		return 2, remaining, true
	case "Distance":
		return 3, remaining, true
	}
	return 0, "", false
}

func stateDeflate(line string) (stateFunc, error) {
	g := &deflateGlobals
	const (
		cmdB   = "bytes "
		cmdBDH = "blockDynamicHuffman "
		cmdBFH = "blockFixedHuffman "
		cmdBNC = "blockNoCompression "
	)
	bits := uint32(0)
	s := ""

	retState := stateFunc(nil)
	switch {
	case line == "":
		g.stream.flush()
		return stateDeflate, nil

	case strings.HasPrefix(line, cmdB):
		s := line[len(cmdB):]
		for s != "" {
			x, ok := uint32(0), false
			x, s, ok = parseHex(s)
			if !ok {
				return nil, fmt.Errorf("bad stateDeflate command: %q", line)
			}
			out = append(out, uint8(x))
		}
		return stateDeflate, nil

	case strings.HasPrefix(line, cmdBNC):
		s = line[len(cmdBNC):]
		retState = stateDeflateNoCompression
		bits |= 0 << 1
	case strings.HasPrefix(line, cmdBFH):
		s = line[len(cmdBFH):]
		retState = stateDeflateFixedHuffman
		bits |= 1 << 1
	case strings.HasPrefix(line, cmdBDH):
		s = line[len(cmdBDH):]
		retState = stateDeflateDynamicHuffman
		bits |= 2 << 1
	default:
		return nil, fmt.Errorf("bad stateDeflate command: %q", line)
	}

	switch s {
	case "(final) {":
		bits |= 1
	case "(nonFinal) {":
		// No-op.
	default:
		return nil, fmt.Errorf("bad stateDeflate command: %q", line)
	}

	g.stream.writeBits(bits, 3)
	return retState, nil
}

func stateDeflateNoCompression(line string) (stateFunc, error) {
	g := &deflateGlobals
	if line == "}" {
		if len(g.bncData) > 0xFFFF {
			return nil, fmt.Errorf("bncData is too long")
		}
		n := uint32(len(g.bncData))
		g.stream.flush()
		g.stream.writeBits(n, 16)
		g.stream.writeBits(0xFFFF-n, 16)
		g.stream.writeBytes(g.bncData)
		g.bncData = g.bncData[:0]
		return stateDeflate, nil
	}

	if lit, ok := deflateParseLiteral(line); ok {
		g.bncData = append(g.bncData, lit...)
		return stateDeflateNoCompression, nil
	}

	return nil, fmt.Errorf("bad blockNoCompression command: %q", line)
}

func stateDeflateFixedHuffman(line string) (stateFunc, error) {
	g := &deflateGlobals
	if line == "}" {
		return stateDeflate, nil
	}

	if line == "endOfBlock" {
		g.stream.writeBits(0, 7)
		return stateDeflateFixedHuffman, nil
	}

	if lit, ok := deflateParseLiteral(line); ok {
		for i := 0; i < len(lit); i++ {
			g.stream.writeFixedHuffmanLCode(uint32(lit[i]))
		}
		return stateDeflateFixedHuffman, nil
	}

	if line == "len 3 distCode 31" {
		lCode, lExtra, lNExtra := deflateEncodeLength(3)
		g.stream.writeFixedHuffmanLCode(lCode)
		g.stream.writeBits(lExtra, lNExtra)
		dCode, dExtra, dNExtra := uint32(31), uint32(0), uint32(0)
		g.stream.writeBits(reverse(dCode, 5), 5)
		g.stream.writeBits(dExtra, dNExtra)
		return stateDeflateFixedHuffman, nil
	}

	if l, d, ok := deflateParseLenDist(line); ok {
		lCode, lExtra, lNExtra := deflateEncodeLength(l)
		g.stream.writeFixedHuffmanLCode(lCode)
		g.stream.writeBits(lExtra, lNExtra)
		dCode, dExtra, dNExtra := deflateEncodeDistance(d)
		g.stream.writeBits(reverse(dCode, 5), 5)
		g.stream.writeBits(dExtra, dNExtra)
		return stateDeflateFixedHuffman, nil
	}

	return nil, fmt.Errorf("bad stateDeflateFixedHuffman command: %q", line)
}

func stateDeflateDynamicHuffman(line string) (stateFunc, error) {
	g := &deflateGlobals
	const (
		cmdH = "huffman "
	)
	switch {
	case line == "}":
		deflateGlobalsClearDynamicHuffmanState()
		return stateDeflate, nil

	case strings.HasPrefix(line, cmdH):
		s := line[len(cmdH):]
		n, s, ok := parseDeflateWhichHuffman(s)
		if !ok {
			break
		}
		g.whichHuffman = n
		return stateDeflateDynamicHuffmanHuffman, nil
	}

	if lit, ok := deflateParseLiteral(line); ok {
		for i := 0; i < len(lit); i++ {
			s := g.huffmans[2][uint32(lit[i])]
			if s == "" {
				return nil, fmt.Errorf("no code for literal %q (%d)", lit[i:i+1], lit[i])
			}
			deflateGlobalsWriteDynamicHuffmanBits(s)
		}
		return stateDeflateDynamicHuffman, nil

	} else if l, d, ok := deflateParseLenDist(line); ok {
		if (l > 10) || (d > 4) {
			return nil, fmt.Errorf("TODO: support len/dist ExtraBits > 0 for dynamic Huffman blocks")
		}
		// len 3 is code 257, len 4 is code 258, etc. All with no ExtraBits.
		if s := g.huffmans[2][l+254]; s != "" {
			deflateGlobalsWriteDynamicHuffmanBits(s)
		} else {
			return nil, fmt.Errorf("no code for literal/length symbol %d", l+254)
		}
		// dist 1 is code 0, dist 2 is code 1, etc. All with no ExtraBits.
		if s := g.huffmans[3][d-1]; s != "" {
			deflateGlobalsWriteDynamicHuffmanBits(s)
		} else {
			return nil, fmt.Errorf("no code for distance symbol %d", d-1)
		}
		return stateDeflateDynamicHuffman, nil

	} else if line == "endOfBlock" {
		s := g.huffmans[2][256]
		if s == "" {
			return nil, fmt.Errorf("no code for end-of-block (256)")
		}
		deflateGlobalsWriteDynamicHuffmanBits(s)
		return stateDeflateDynamicHuffman, nil
	}

	return nil, fmt.Errorf("bad stateDeflateDynamicHuffman command: %q", line)
}

func stateDeflateDynamicHuffmanHuffman(line string) (stateFunc, error) {
	g := &deflateGlobals
outer:
	switch {
	case line == "}":
		g.whichHuffman = 0
		g.prevLine = ""
		g.etcetera = false

		// If we have all three Huffman tables, write them.
		for i := 1; ; i++ {
			if i == 4 {
				if err := deflateGlobalsWriteDynamicHuffmanTables(); err != nil {
					return nil, err
				}
				break
			}
			if g.huffmans[i] == nil {
				break
			}
		}

		return stateDeflateDynamicHuffman, nil

	case line == "etcetera":
		g.etcetera = true
		return stateDeflateDynamicHuffmanHuffman, nil

	default:
		s := line
		n, s, ok := parseNum(s)
		if !ok || s == "" {
			break
		}
		for i := 0; i < len(s); i++ {
			if c := s[i]; c != '0' && c != '1' {
				break outer
			}
		}
		if (len(s) < 1) || (15 < len(s)) {
			return nil, fmt.Errorf("%q code length, %d, is out of range", s, len(s))
		}

		if g.etcetera {
			g.etcetera = false
			n0, s0, ok := parseNum(g.prevLine)
			if !ok {
				return nil, fmt.Errorf("bad etcetera command")
			}
			if err := stateDeflateDHHEtcetera(n0, s0, n, s); err != nil {
				return nil, err
			}
		}

		if g.huffmans[g.whichHuffman] == nil {
			g.huffmans[g.whichHuffman] = deflateHuffmanTable{}
		}
		g.huffmans[g.whichHuffman][n] = s
		g.prevLine = line
		return stateDeflateDynamicHuffmanHuffman, nil
	}

	return nil, fmt.Errorf("bad stateDeflateDynamicHuffmanHuffman command: %q", line)
}

// stateDeflateDHHEtcetera expands the "etcetera" line in:
//
// 0  0000
// 1  0001
// etcetera
// 7  0111
//
// to produce the implicit lines:
//
// 0  0000
// 1  0001
// 2  0010
// 3  0011
// 4  0100
// 5  0101
// 6  0110
// 7  0111
func stateDeflateDHHEtcetera(n0 uint32, s0 string, n1 uint32, s1 string) error {
	b := []byte(s0)
	if !incrementBitstring(b) {
		return fmt.Errorf("etcetera: could not increment bitstring")
	}
	for n := n0 + 1; n < n1; n++ {
		line := fmt.Sprintf("%d %s", n, b)
		if _, err := stateDeflateDynamicHuffmanHuffman(line); err != nil {
			return err
		}
		if !incrementBitstring(b) {
			return fmt.Errorf("etcetera: could not increment bitstring")
		}
	}
	if string(b) != s1 {
		return fmt.Errorf("etcetera: final bitstring: got %q, want %q", b, s1)
	}
	return nil
}

func incrementBitstring(b []byte) (ok bool) {
	for i := len(b) - 1; i >= 0; i-- {
		switch b[i] {
		case '0':
			b[i] = '1'
			return true
		case '1':
			b[i] = '0'
		default:
			return false
		}
	}
	return false
}

type deflateBitStream struct {
	bits  uint32
	nBits uint32 // Always within [0, 7].
}

// writeBits writes the low n bits of b to z.
func (z *deflateBitStream) writeBits(b uint32, n uint32) {
	if n > 24 {
		panic("writeBits: n is too large")
	}
	z.bits |= b << z.nBits
	z.nBits += n
	for z.nBits >= 8 {
		out = append(out, uint8(z.bits))
		z.bits >>= 8
		z.nBits -= 8
	}
}

func (z *deflateBitStream) writeBytes(b []byte) {
	z.flush()
	out = append(out, b...)
}

func (z *deflateBitStream) writeFixedHuffmanLCode(lCode uint32) {
	switch {
	case lCode < 144: // 0b._0011_0000 through 0b._1011_1111
		lCode += 0x030
		z.writeBits(reverse(lCode, 8), 8)
	case lCode < 256: // 0b1_1001_0000 through 0b1_1111_1111
		lCode += 0x190 - 144
		z.writeBits(reverse(lCode, 9), 9)
	case lCode < 280: // 0b._.000_0000 through 0b._.001_0111
		lCode -= 256 - 0x000
		z.writeBits(reverse(lCode, 7), 7)
	default: //          0b._1100_0000 through 0b._1100_0111
		lCode -= 280 - 0x0C0
		z.writeBits(reverse(lCode, 8), 8)
	}
}

func (z *deflateBitStream) flush() {
	if z.nBits > 0 {
		out = append(out, uint8(z.bits))
		z.bits = 0
		z.nBits = 0
	}
}

func deflateEncodeLength(l uint32) (code uint32, extra uint32, nExtra uint32) {
	switch {
	case l < 3:
		// No-op.
	case l < 11:
		l -= 3
		return (l >> 0) + 257, l & 0x0000, 0
	case l < 19:
		l -= 11
		return (l >> 1) + 265, l & 0x0001, 1
	case l < 35:
		l -= 19
		return (l >> 2) + 269, l & 0x0003, 2
	case l < 67:
		l -= 35
		return (l >> 3) + 273, l & 0x0007, 3
	case l < 131:
		l -= 67
		return (l >> 4) + 277, l & 0x000F, 4
	case l < 258:
		l -= 131
		return (l >> 5) + 281, l & 0x001F, 5
	case l == 258:
		return 285, 0, 0
	}
	panic(fmt.Sprintf("deflateEncodeLength: l=%d", l))
}

func deflateEncodeDistance(d uint32) (code uint32, extra uint32, nExtra uint32) {
	switch {
	case d < 1:
		// No-op.
	case d < 5:
		d -= 1
		return (d >> 0) + 0, d & 0x0000, 0
	case d < 9:
		d -= 5
		return (d >> 1) + 4, d & 0x0001, 1
	case d < 17:
		d -= 9
		return (d >> 2) + 6, d & 0x0003, 2
	case d < 33:
		d -= 17
		return (d >> 3) + 8, d & 0x0007, 3
	case d < 65:
		d -= 33
		return (d >> 4) + 10, d & 0x000F, 4
	case d < 129:
		d -= 65
		return (d >> 5) + 12, d & 0x001F, 5
	case d < 257:
		d -= 129
		return (d >> 6) + 14, d & 0x003F, 6
	case d < 513:
		d -= 257
		return (d >> 7) + 16, d & 0x007F, 7
	case d < 1025:
		d -= 513
		return (d >> 8) + 18, d & 0x00FF, 8
	case d < 2049:
		d -= 1025
		return (d >> 9) + 20, d & 0x01FF, 9
	case d < 4097:
		d -= 2049
		return (d >> 10) + 22, d & 0x03FF, 10
	case d < 8193:
		d -= 4097
		return (d >> 11) + 24, d & 0x07FF, 11
	case d < 16385:
		d -= 8193
		return (d >> 12) + 26, d & 0x0FFF, 12
	case d < 32769:
		d -= 16385
		return (d >> 13) + 28, d & 0x1FFF, 13
	}
	panic(fmt.Sprintf("deflateEncodeDistance: d=%d", d))
}

func deflateParseLiteral(s string) (lit string, ok bool) {
	// TODO: support "\xAB" escape codes in the script?
	const (
		prefix = `literal "`
		suffix = `"`
	)
	if strings.HasPrefix(s, prefix) {
		s = s[len(prefix):]
		if strings.HasSuffix(s, suffix) {
			return s[:len(s)-len(suffix)], true
		}
	}
	return "", false
}

func deflateParseLenDist(line string) (l uint32, d uint32, ok bool) {
	const (
		lStr = "len "
		dStr = "dist "
	)
	s := line
	if strings.HasPrefix(s, lStr) {
		s = s[len(lStr):]
		if l, s, ok := parseNum(s); ok && 3 <= l && l <= 258 {
			if strings.HasPrefix(s, dStr) {
				s = s[len(dStr):]
				if d, s, ok := parseNum(s); ok && 1 <= d && d <= 32768 && s == "" {
					return l, d, true
				}
			}
		}
	}
	return 0, 0, false
}

// ----

func init() {
	formats["gif"] = stateGif
}

var gifGlobals struct {
	imageWidth                uint32
	imageHeight               uint32
	imageBackgroundColorIndex uint32

	frameInterlaced bool
	frameLeft       uint32
	frameTop        uint32
	frameWidth      uint32
	frameHeight     uint32

	globalPalette [][4]uint8
	localPalette  [][4]uint8
}

func stateGif(line string) (stateFunc, error) {
	const (
		cmdB  = "bytes "
		cmdGC = "graphicControl "
		cmdL  = "lzw "
		cmdLC = "loopCount "
	)
outer:
	switch {
	case line == "":
		return stateGif, nil

	case line == "frame {":
		gifGlobals.frameInterlaced = false
		gifGlobals.frameLeft = 0
		gifGlobals.frameTop = 0
		gifGlobals.frameWidth = 0
		gifGlobals.frameHeight = 0
		gifGlobals.localPalette = nil
		out = append(out, 0x2C)
		return stateGifFrame, nil

	case line == "header":
		out = append(out, "GIF89a"...)
		return stateGif, nil

	case line == "image {":
		return stateGifImage, nil

	case line == "trailer":
		out = append(out, 0x3B)
		return stateGif, nil

	case strings.HasPrefix(line, cmdB):
		s := line[len(cmdB):]
		for s != "" {
			x, ok := uint32(0), false
			x, s, ok = parseHex(s)
			if !ok {
				break outer
			}
			out = append(out, uint8(x))
		}
		return stateGif, nil

	case strings.HasPrefix(line, cmdGC):
		s := line[len(cmdGC):]

		flags := uint8(0)
		duration := uint32(0)
		transparentIndex := uint8(0)
		for s != "" {
			term := ""
			if i := strings.IndexByte(s, ' '); i >= 0 {
				term, s = s[:i], s[i+1:]
			} else {
				term, s = s, ""
			}

			const (
				ms    = "ms"
				trans = "transparentIndex="
			)
			switch {
			case term == "animationDisposalNone":
				flags |= 0x00
			case term == "animationDisposalRestoreBackground":
				flags |= 0x08
			case term == "animationDisposalRestorePrevious":
				flags |= 0x0C
			case strings.HasPrefix(term, trans):
				num, err := strconv.ParseUint(term[len(trans):], 0, 8)
				if err != nil {
					break outer
				}
				flags |= 0x01
				transparentIndex = uint8(num)
			case strings.HasSuffix(term, ms):
				num, remaining, ok := parseNum(term[:len(term)-len(ms)])
				if !ok || remaining != "" {
					break outer
				}
				duration = num / 10 // GIF's unit of time is 10ms.
			default:
				break outer
			}
		}

		out = append(out,
			0x21, 0xF9, 0x04,
			flags,
			uint8(duration>>0),
			uint8(duration>>8),
			transparentIndex,
			0x00,
		)
		return stateGif, nil

	case strings.HasPrefix(line, cmdL):
		s := line[len(cmdL):]
		litWidth, s, ok := parseNum(s)
		if !ok || litWidth < 2 || 8 < litWidth {
			break
		}
		out = append(out, uint8(litWidth))

		uncompressed := []byte(nil)
		for s != "" {
			x := uint32(0)
			x, s, ok = parseHex(s)
			if !ok {
				break outer
			}
			uncompressed = append(uncompressed, uint8(x))
		}

		buf := bytes.NewBuffer(nil)
		w := lzw.NewWriter(buf, lzw.LSB, int(litWidth))
		if _, err := w.Write(uncompressed); err != nil {
			return nil, err
		}
		if err := w.Close(); err != nil {
			return nil, err
		}
		compressed := buf.Bytes()

		for len(compressed) > 0 {
			if len(compressed) <= 0xFF {
				out = append(out, uint8(len(compressed)))
				out = append(out, compressed...)
				compressed = nil
			} else {
				out = append(out, 0xFF)
				out = append(out, compressed[:0xFF]...)
				compressed = compressed[0xFF:]
			}
		}
		out = append(out, 0x00)
		return stateGif, nil

	case strings.HasPrefix(line, cmdLC):
		s := line[len(cmdLC):]
		loopCount, _, ok := parseNum(s)
		if !ok || 0xFFFF < loopCount {
			break
		}
		out = append(out,
			0x21, // Extension Introducer.
			0xFF, // Application Extension Label.
			0x0B, // Block Size.
		)
		out = append(out, "NETSCAPE2.0"...)
		out = append(out,
			0x03, // Block Size.
			0x01, // Magic Number.
			byte(loopCount),
			byte(loopCount>>8),
			0x00, // Block Terminator.
		)
		return stateGif, nil
	}

	return nil, fmt.Errorf("bad stateGif command: %q", line)
}

func stateGifImage(line string) (stateFunc, error) {
	g := &gifGlobals
	if line == "}" {
		out = appendU16LE(out, uint16(g.imageWidth))
		out = appendU16LE(out, uint16(g.imageHeight))
		if g.globalPalette == nil {
			out = append(out, 0x00)
		} else if n := log2(uint32(len(g.globalPalette))); n < 2 || 8 < n {
			return nil, fmt.Errorf("bad len(g.globalPalette): %d", len(g.globalPalette))
		} else {
			out = append(out, 0x80|uint8(n-1))
		}
		out = append(out, uint8(g.imageBackgroundColorIndex))
		out = append(out, 0x00)
		for _, x := range g.globalPalette {
			out = append(out, x[0], x[1], x[2])
		}
		return stateGif, nil
	}

	const (
		cmdBCI = "backgroundColorIndex "
		cmdIWH = "imageWidthHeight "
		cmdP   = "palette {"
	)
	switch {
	case strings.HasPrefix(line, cmdBCI):
		s := line[len(cmdBCI):]
		if i, _, ok := parseNum(s); ok {
			g.imageBackgroundColorIndex = i
		}
		return stateGifImage, nil

	case strings.HasPrefix(line, cmdIWH):
		s := line[len(cmdIWH):]
		if w, s, ok := parseNum(s); ok {
			if h, _, ok := parseNum(s); ok {
				g.imageWidth = w
				g.imageHeight = h
				return stateGifImage, nil
			}
		}

	case strings.HasPrefix(line, cmdP):
		return stateGifImagePalette, nil
	}

	return nil, fmt.Errorf("bad stateGifImage command: %q", line)
}

func stateGifFrame(line string) (stateFunc, error) {
	g := &gifGlobals
	if line == "}" {
		out = appendU16LE(out, uint16(g.frameLeft))
		out = appendU16LE(out, uint16(g.frameTop))
		out = appendU16LE(out, uint16(g.frameWidth))
		out = appendU16LE(out, uint16(g.frameHeight))
		flags := byte(0x00)
		if g.frameInterlaced {
			flags |= 0x40
		}
		if g.localPalette == nil {
			out = append(out, flags)
		} else if n := log2(uint32(len(g.localPalette))); n < 2 || 8 < n {
			return nil, fmt.Errorf("bad len(g.localPalette): %d", len(g.localPalette))
		} else {
			out = append(out, flags|0x80|uint8(n-1))
		}
		for _, x := range g.localPalette {
			out = append(out, x[0], x[1], x[2])
		}
		return stateGif, nil
	}

	const (
		cmdFLTWH = "frameLeftTopWidthHeight "
		cmdP     = "palette {"
	)
	switch {
	case line == "interlaced":
		g.frameInterlaced = true
		return stateGifFrame, nil

	case strings.HasPrefix(line, cmdFLTWH):
		s := line[len(cmdFLTWH):]
		if l, s, ok := parseNum(s); ok {
			if t, s, ok := parseNum(s); ok {
				if w, s, ok := parseNum(s); ok {
					if h, _, ok := parseNum(s); ok {
						g.frameLeft = l
						g.frameTop = t
						g.frameWidth = w
						g.frameHeight = h
						return stateGifFrame, nil
					}
				}
			}
		}

	case strings.HasPrefix(line, cmdP):
		return stateGifFramePalette, nil
	}

	return nil, fmt.Errorf("bad stateGifFrame command: %q", line)
}

func stateGifImagePalette(line string) (stateFunc, error) {
	g := &gifGlobals
	if line == "}" {
		return stateGifImage, nil
	}

	s := line
	if rgb0, s, ok := parseHex(s); ok {
		if rgb1, s, ok := parseHex(s); ok {
			if rgb2, _, ok := parseHex(s); ok {
				g.globalPalette = append(g.globalPalette,
					[4]uint8{uint8(rgb0), uint8(rgb1), uint8(rgb2), 0xFF})
				return stateGifImagePalette, nil
			}
		}
	}

	return nil, fmt.Errorf("bad stateGifImagePalette command: %q", line)
}

func stateGifFramePalette(line string) (stateFunc, error) {
	g := &gifGlobals
	if line == "}" {
		return stateGifFrame, nil
	}

	s := line
	if rgb0, s, ok := parseHex(s); ok {
		if rgb1, s, ok := parseHex(s); ok {
			if rgb2, _, ok := parseHex(s); ok {
				g.localPalette = append(g.localPalette,
					[4]uint8{uint8(rgb0), uint8(rgb1), uint8(rgb2), 0xFF})
				return stateGifFramePalette, nil
			}
		}
	}

	return nil, fmt.Errorf("bad stateGifFramePalette command: %q", line)
}

// ----

func init() {
	formats["png"] = statePng
}

var pngGlobals struct {
	scratch [4]byte

	animSeqNum uint32
	chunkData  bytes.Buffer
	chunkType  string
	zlibWriter *zlib.Writer
}

func statePng(line string) (stateFunc, error) {
	g := &pngGlobals
	switch {
	case line == "":
		return statePng, nil

	case line == "magic":
		out = append(out, "\x89PNG\x0D\x0A\x1A\x0A"...)
		return statePng, nil

	case (len(line) == 6) && (line[4] == ' ') && (line[5] == '{'):
		g.chunkData.Reset()
		g.chunkType = line[:4]
		return statePngChunk, nil
	}

	return nil, fmt.Errorf("bad statePng command: %q", line)
}

func statePngChunk(line string) (stateFunc, error) {
	g := &pngGlobals
	if line == "}" {
		if n := g.chunkData.Len(); n > 0xFFFF_FFFF {
			return nil, fmt.Errorf("chunkData is too long")
		}
		out = appendU32BE(out, uint32(g.chunkData.Len()))
		n := len(out)
		out = append(out, g.chunkType...)
		out = append(out, g.chunkData.Bytes()...)
		out = appendU32BE(out, crc32.ChecksumIEEE(out[n:]))
		return statePng, nil
	}

	switch {
	case line == "animSeqNum++":
		g.chunkData.Write(appendU32BE(g.scratch[:0], g.animSeqNum))
		g.animSeqNum++
		return statePngChunk, nil

	case line == "raw {":
		return statePngRaw, nil

	case line == "zlib {":
		g.zlibWriter = zlib.NewWriter(&g.chunkData)
		return statePngZlib, nil
	}

	return nil, fmt.Errorf("bad statePngChunk command: %q", line)
}

func statePngRaw(line string) (stateFunc, error) {
	g := &pngGlobals
	if line == "}" {
		return statePngChunk, nil
	}

	for s := line; s != ""; {
		if x, remaining, ok := parseHex(s); ok {
			g.chunkData.WriteByte(byte(x))
			s = remaining
		} else {
			return nil, fmt.Errorf("bad statePngRaw command: %q", line)
		}
	}
	return statePngRaw, nil
}

func statePngZlib(line string) (stateFunc, error) {
	g := &pngGlobals
	if line == "}" {
		if err := g.zlibWriter.Close(); err != nil {
			return nil, fmt.Errorf("statePngZlib: %w", err)
		}
		return statePngChunk, nil
	}

	for s := line; s != ""; {
		if x, remaining, ok := parseHex(s); ok {
			g.scratch[0] = byte(x)
			g.zlibWriter.Write(g.scratch[:1])
			s = remaining
		} else {
			return nil, fmt.Errorf("bad statePngZlib command: %q", line)
		}
	}
	return statePngZlib, nil
}
