// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/os2bmp.c
// Function: do_extract_CI_or_CP
static void do_extract_CI_or_CP(deark *c, enum fmtcode fmt, const char *fmtname, i64 pos)
{
	struct de_bmpinfo *bi = NULL;
	i64 i;
	dbuf *f = NULL;
	i64 hdrpos[2];
	i64 hdrsize[2];
	i64 oldbitsoffs[2];
	i64 newbitsoffs[2];
	i64 bitssize[2];
	int saved_indent_level;

	de_dbg_indent_save(c, &saved_indent_level);
	de_dbg(c, "%s image at %d", fmtname, (int)pos);
	de_dbg_indent(c, 1);

	bi = de_malloc(c, sizeof(struct de_bmpinfo));

	if(fmt==DE_OS2FMT_CP) {
		f = dbuf_create_output_file(c, "ptr", NULL, 0);
	}
	else {
		f = dbuf_create_output_file(c, "os2.ico", NULL, 0);
	}

	for(i=0; i<2; i++) {
		de_dbg(c, "bitmap at %d", (int)pos);
		de_dbg_indent(c, 1);

		if(!fmtutil_get_bmpinfo(c, c->infile, bi, pos, c->infile->len - pos,
			DE_BMPINFO_HAS_FILEHEADER))
		{
			de_err(c, "Unsupported image type");
			goto done;
		}
		if(bi->compression_field!=0) {
			de_err(c, "Unsupported compression type (%d)", (int)bi->compression_field);
			goto done;
		}

		de_dbg(c, "bits size: %d", (int)bi->foreground_size);

		hdrpos[i] = pos;
		hdrsize[i] = bi->size_of_headers_and_pal;
		oldbitsoffs[i] = bi->bitsoffset;
		bitssize[i] = bi->foreground_size;

		pos += bi->size_of_headers_and_pal;

		de_dbg_indent(c, -1);
	}

	newbitsoffs[0] = hdrsize[0] + hdrsize[1];
	newbitsoffs[1] = newbitsoffs[0] + bitssize[0];

	// Write all the headers.
	for(i=0; i<2; i++) {
		// Copy the first 10 bytes of the fileheader.
		dbuf_copy(c->infile, hdrpos[i], 10, f);
		// Update the bits offset.
		dbuf_writeu32le(f, newbitsoffs[i]);
		// Copy the rest of the headers (+palette).
		dbuf_copy(c->infile, hdrpos[i]+14, hdrsize[i]-14, f);
	}
	// Write all the bitmaps.
	for(i=0; i<2; i++) {
		dbuf_copy(c->infile, oldbitsoffs[i], bitssize[i], f);
	}

done:
	de_dbg_indent_restore(c, saved_indent_level);
	dbuf_close(f);
	de_free(c, bi);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq $0x0, -0x28(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x8(%rbp), %rdi
leaq -0x94(%rbp), %rsi
callq 0x15b580
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rax
movl %eax, %ecx
leaq 0xd6320(%rip), %rsi     # 0x1bd3ff
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movl $0x1, %esi
callq 0x15b560
movq -0x8(%rbp), %rdi
movl $0xa0, %esi
callq 0x15b780
movq %rax, -0x28(%rbp)
cmpl $0xa, -0xc(%rbp)
jne 0xe7128
movq -0x8(%rbp), %rdi
leaq 0xc21c5(%rip), %rsi     # 0x1a92dc
xorl %eax, %eax
movl %eax, %edx
xorl %ecx, %ecx
callq 0x166c60
movq %rax, -0x38(%rbp)
jmp 0xe7142
movq -0x8(%rbp), %rdi
leaq 0xc219e(%rip), %rsi     # 0x1a92d1
xorl %eax, %eax
movl %eax, %edx
xorl %ecx, %ecx
callq 0x166c60
movq %rax, -0x38(%rbp)
movq $0x0, -0x30(%rbp)
cmpq $0x2, -0x30(%rbp)
jge 0xe7282
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movl %eax, %edx
leaq 0xdb042(%rip), %rsi     # 0x1c21a8
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movl $0x1, %esi
callq 0x15b560
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0x28(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x18(%rax), %r8
subq -0x20(%rbp), %r8
movl $0x1, %r9d
callq 0x172d70
cmpl $0x0, %eax
jne 0xe71c6
movq -0x8(%rbp), %rdi
leaq 0xbc306(%rip), %rsi     # 0x1a34c0
movb $0x0, %al
callq 0x15bfb0
jmp 0xe735b
movq -0x28(%rbp), %rax
cmpl $0x0, 0x38(%rax)
je 0xe71ee
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
movl 0x38(%rax), %edx
leaq 0xc5038(%rip), %rsi     # 0x1ac21a
movb $0x0, %al
callq 0x15bfb0
jmp 0xe735b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
movq 0x68(%rax), %rax
movl %eax, %edx
leaq 0xd620b(%rip), %rsi     # 0x1bd40e
movb $0x0, %al
callq 0x15b0d0
movq -0x20(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, -0x50(%rbp,%rax,8)
movq -0x28(%rbp), %rax
movq 0x88(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, -0x60(%rbp,%rax,8)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, -0x70(%rbp,%rax,8)
movq -0x28(%rbp), %rax
movq 0x68(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, -0x90(%rbp,%rax,8)
movq -0x28(%rbp), %rax
movq 0x88(%rax), %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x8(%rbp), %rdi
movl $0xffffffff, %esi       # imm = 0xFFFFFFFF
callq 0x15b560
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0xe714a
movq -0x60(%rbp), %rax
addq -0x58(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
addq -0x90(%rbp), %rax
movq %rax, -0x78(%rbp)
movq $0x0, -0x30(%rbp)
cmpq $0x2, -0x30(%rbp)
jge 0xe7316
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x30(%rbp), %rax
movq -0x50(%rbp,%rax,8), %rsi
movq -0x38(%rbp), %rcx
movl $0xa, %edx
callq 0x166070
movq -0x38(%rbp), %rdi
movq -0x30(%rbp), %rax
movq -0x80(%rbp,%rax,8), %rsi
callq 0x168c30
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x30(%rbp), %rax
movq -0x50(%rbp,%rax,8), %rsi
addq $0xe, %rsi
movq -0x30(%rbp), %rax
movq -0x60(%rbp,%rax,8), %rdx
subq $0xe, %rdx
movq -0x38(%rbp), %rcx
callq 0x166070
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0xe72a5
movq $0x0, -0x30(%rbp)
cmpq $0x2, -0x30(%rbp)
jge 0xe7359
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x30(%rbp), %rax
movq -0x70(%rbp,%rax,8), %rsi
movq -0x30(%rbp), %rax
movq -0x90(%rbp,%rax,8), %rdx
movq -0x38(%rbp), %rcx
callq 0x166070
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0xe731e
jmp 0xe735b
movq -0x8(%rbp), %rdi
movl -0x94(%rbp), %esi
callq 0x15b5a0
movq -0x38(%rbp), %rdi
callq 0x1676a0
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x15b820
addq $0xa0, %rsp
popq %rbp
retq
nopl (%rax)