// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/src/deark-dbuf.c
// Function: dbuf_write_at
void dbuf_write_at(dbuf *f, i64 pos, const u8 *m, i64 len)
{
	if(len<1 || pos<0) return;

	if(pos + len > f->max_len_hard) {
		do_on_dbuf_size_exceeded(f);
	}

	if(f->btype==DBUF_TYPE_MEMBUF) {
		i64 amt_overwrite, amt_newzeroes, amt_append;

		if(pos+len <= f->len) { // entirely within the current file
			amt_overwrite = len;
			amt_newzeroes = 0;
			amt_append = 0;
		}
		else if(pos >= f->len) { // starts after the end of the current file
			amt_overwrite = 0;
			amt_newzeroes = pos - f->len;
			amt_append = len;
		}
		else { // overlaps the end of the current file
			amt_overwrite = f->len - pos;
			amt_newzeroes = 0;
			amt_append = len - amt_overwrite;
		}

		if(amt_overwrite>0) {
			de_memcpy(&f->membuf_buf[pos], m, (size_t)amt_overwrite);
		}
		if(amt_newzeroes>0) {
			dbuf_write_zeroes(f, amt_newzeroes);
		}
		if(amt_append>0) {
			membuf_append(f, &m[amt_overwrite], amt_append);
		}
	}
	else if(f->btype==DBUF_TYPE_OFILE && !f->is_managed) {
		i64 curpos = de_ftell(f->fp);
		if(pos != curpos) {
			de_fseek(f->fp, pos, SEEK_SET);
		}
		fwrite(m, 1, (size_t)len, f->fp);
		if(pos+len > f->len) {
			f->len = pos+len;
		}
	}
	else if(f->btype==DBUF_TYPE_NULL) {
		if(pos+len > f->len) {
			f->len = pos+len;
		}
	}
	else {
		de_internal_err_fatal(f->c, "Attempt to seek on non-seekable stream");
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
cmpq $0x1, -0x20(%rbp)
jl 0x168416
cmpq $0x0, -0x10(%rbp)
jge 0x16841b
jmp 0x1685e0
movq -0x10(%rbp), %rax
addq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x20(%rcx), %rax
jle 0x168436
movq -0x8(%rbp), %rdi
callq 0x1680c0
movq -0x8(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x16851a
movq -0x10(%rbp), %rax
addq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jg 0x16846f
movq -0x20(%rbp), %rax
movq %rax, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq $0x0, -0x38(%rbp)
jmp 0x1684c5
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jl 0x16849f
movq $0x0, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
subq 0x18(%rcx), %rax
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x38(%rbp)
jmp 0x1684c3
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
subq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq -0x20(%rbp), %rax
subq -0x28(%rbp), %rax
movq %rax, -0x38(%rbp)
jmp 0x1684c5
cmpq $0x0, -0x28(%rbp)
jle 0x1684e5
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rdi
addq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x28(%rbp), %rdx
callq 0x191e0
cmpq $0x0, -0x30(%rbp)
jle 0x1684f9
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x1685f0
cmpq $0x0, -0x38(%rbp)
jle 0x168515
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
addq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rdx
callq 0x168620
jmp 0x1685e0
movq -0x8(%rbp), %rax
cmpl $0x2, (%rax)
jne 0x168599
movq -0x8(%rbp), %rax
cmpb $0x0, 0x4(%rax)
jne 0x168599
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x18fe20
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
cmpq -0x40(%rbp), %rax
je 0x16855b
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
xorl %edx, %edx
callq 0x18fdf0
movq -0x18(%rbp), %rdi
movq -0x20(%rbp), %rdx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rcx
movl $0x1, %esi
callq 0x19290
movq -0x10(%rbp), %rax
addq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jle 0x168597
movq -0x10(%rbp), %rcx
addq -0x20(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x18(%rax)
jmp 0x1685de
movq -0x8(%rbp), %rax
cmpl $0x0, (%rax)
jne 0x1685c6
movq -0x10(%rbp), %rax
addq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jle 0x1685c4
movq -0x10(%rbp), %rcx
addq -0x20(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x18(%rax)
jmp 0x1685dc
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
leaq 0x6c8bf(%rip), %rsi     # 0x1d4e94
movb $0x0, %al
callq 0x15c2a0
jmp 0x1685de
jmp 0x1685e0
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)