// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/src/fmtutil-cmpr.c
// Function: my_rle90_codec_addbuf
static void my_rle90_codec_addbuf(struct de_dfilter_ctx *dfctx,
	const u8 *buf, i64 buf_len)
{
	int i;
	u8 b;
	struct rle90ctx *rctx = (struct rle90ctx*)dfctx->codec_private;

	if(!rctx) return;

	for(i=0; i<buf_len; i++) {
		if(dfctx->dcmpro->len_known &&
			(rctx->nbytes_written >= dfctx->dcmpro->expected_len))
		{
			dfctx->finished_flag = 1;
			break;
		}

		b = buf[i];
		rctx->total_nbytes_processed++;

		if(rctx->countcode_pending && b==0) {
			// Not RLE, just an escaped 0x90 byte.
			dbuf_writebyte(dfctx->dcmpro->f, 0x90);
			rctx->nbytes_written++;
			rctx->last_output_byte = 0x90;
			rctx->countcode_pending = 0;
		}
		else if(rctx->countcode_pending) {
			i64 count;

			// RLE. We already emitted one byte (because the byte to repeat
			// comes before the repeat count), so write countcode-1 bytes.
			count = (i64)(b-1);
			if(dfctx->dcmpro->len_known &&
				(rctx->nbytes_written+count > dfctx->dcmpro->expected_len))
			{
				count = dfctx->dcmpro->expected_len - rctx->nbytes_written;
			}
			dbuf_write_run(dfctx->dcmpro->f, rctx->last_output_byte, count);
			rctx->nbytes_written += count;

			rctx->countcode_pending = 0;
		}
		else if(b==0x90) {
			rctx->countcode_pending = 1;
		}
		else {
			dbuf_writebyte(dfctx->dcmpro->f, b);
			rctx->nbytes_written++;
			rctx->last_output_byte = b;
		}
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x17807c
jmp 0x178224
movl $0x0, -0x1c(%rbp)
movslq -0x1c(%rbp), %rax
cmpq -0x18(%rbp), %rax
jge 0x178224
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movzbl 0x8(%rax), %eax
cmpl $0x0, %eax
je 0x1780c5
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x8(%rbp), %rcx
movq 0x10(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jl 0x1780c5
movq -0x8(%rbp), %rax
movb $0x1, 0x20(%rax)
jmp 0x178224
movq -0x10(%rbp), %rax
movslq -0x1c(%rbp), %rcx
movb (%rax,%rcx), %al
movb %al, -0x1d(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq -0x28(%rbp), %rax
cmpl $0x0, 0x14(%rax)
je 0x178131
movzbl -0x1d(%rbp), %eax
cmpl $0x0, %eax
jne 0x178131
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
movl $0x90, %esi
callq 0x168380
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rax
movb $-0x70, 0x10(%rax)
movq -0x28(%rbp), %rax
movl $0x0, 0x14(%rax)
jmp 0x178214
movq -0x28(%rbp), %rax
cmpl $0x0, 0x14(%rax)
je 0x1781ca
movzbl -0x1d(%rbp), %eax
subl $0x1, %eax
cltq
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movzbl 0x8(%rax), %eax
cmpl $0x0, %eax
je 0x17818f
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
addq -0x30(%rbp), %rax
movq -0x8(%rbp), %rcx
movq 0x10(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jle 0x17818f
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movq -0x28(%rbp), %rcx
subq 0x8(%rcx), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
movq -0x28(%rbp), %rax
movb 0x10(%rax), %al
movq -0x30(%rbp), %rdx
movzbl %al, %esi
callq 0x168800
movq -0x30(%rbp), %rcx
movq -0x28(%rbp), %rax
addq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rax
movl $0x0, 0x14(%rax)
jmp 0x178212
movzbl -0x1d(%rbp), %eax
cmpl $0x90, %eax
jne 0x1781e2
movq -0x28(%rbp), %rax
movl $0x1, 0x14(%rax)
jmp 0x178210
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
movzbl -0x1d(%rbp), %esi
callq 0x168380
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x8(%rax)
movb -0x1d(%rbp), %cl
movq -0x28(%rbp), %rax
movb %cl, 0x10(%rax)
jmp 0x178212
jmp 0x178214
jmp 0x178216
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x178083
addq $0x30, %rsp
popq %rbp
retq
nopw (%rax,%rax)