// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/hfs.c
// Function: do_extract_file
static void do_extract_file(deark *c, lctx *d, struct nodedata *nd,
	struct recorddata *rd, struct de_advfile *advf)
{
	i64 pos = rd->datapos;
	i64 n;
	struct extract_ctx *ectx = NULL;

	ectx = de_malloc(c, sizeof(struct extract_ctx));
	ectx->d = d;
	ectx->rd = rd;
	ectx->fki_data = de_malloc(c, sizeof(struct fork_info));
	ectx->fki_rsrc = de_malloc(c, sizeof(struct fork_info));
	ectx->fki_rsrc->is_rsrc = 1;

	pos += 2; // common fields, already read

	n = (i64)de_getbyte_p(&pos);
	de_dbg(c, "filFlags: %d", (int)n);

	n = (i64)de_getbyte_p(&pos);
	de_dbg(c, "filTyp: %d", (int)n);

	read_finder_info(c, d, advf, pos);
	pos += 16; // filUsrWds, Finder info

	pos += 4; // filFlNum, file id

	ectx->fki_data->first_alloc_blk = de_getu16be_p(&pos);
	de_dbg(c, "data fork first alloc blk: %d", (int)ectx->fki_data->first_alloc_blk);
	ectx->fki_data->logical_eof = de_getu32be_p(&pos);
	de_dbg(c, "data fork logical eof: %d", (int)ectx->fki_data->logical_eof);
	ectx->fki_data->physical_eof = de_getu32be_p(&pos);
	de_dbg(c, "data fork physical eof: %d", (int)ectx->fki_data->physical_eof);

	ectx->fki_rsrc->first_alloc_blk = de_getu16be_p(&pos);
	de_dbg(c, "rsrc fork first alloc blk: %d", (int)ectx->fki_rsrc->first_alloc_blk);
	ectx->fki_rsrc->logical_eof = de_getu32be_p(&pos);
	de_dbg(c, "rsrc fork logical eof: %d", (int)ectx->fki_rsrc->logical_eof);
	ectx->fki_rsrc->physical_eof = de_getu32be_p(&pos);
	de_dbg(c, "rsrc fork physical eof: %d", (int)ectx->fki_rsrc->physical_eof);

	read_timestamp_fields(c, d, pos, advf->mainfork.fi);
	pos += 12;

	pos += 16; // filFndrInfo sizeof(FXInfo)

	n = de_getu16be_p(&pos);
	de_dbg(c, "filClpSize: %d", (int)n);

	read_ExtDataRecs(c, d, pos, ectx->fki_data->ExtRec, 3, "filExtRec");
	pos += 12;
	read_ExtDataRecs(c, d, pos, ectx->fki_rsrc->ExtRec, 3, "filRExtRec");
	pos += 12;

	ectx->fki_rsrc->fork_exists = (ectx->fki_rsrc->logical_eof>0);
	ectx->fki_data->fork_exists = (ectx->fki_data->logical_eof>0 || !ectx->fki_rsrc->fork_exists);

	if(ectx->fki_data->fork_exists) {
		do_extract_fork_init(c, d, rd, ectx->fki_data);
		if(!ectx->fki_data->extract_error_flag) {
			advf->mainfork.fork_len = ectx->fki_data->logical_eof;
			advf->mainfork.fork_exists = 1;
		}
	}
	if(ectx->fki_rsrc->fork_exists) {
		do_extract_fork_init(c, d, rd, ectx->fki_rsrc);
		if(!ectx->fki_rsrc->extract_error_flag) {
			advf->rsrcfork.fork_len = ectx->fki_rsrc->logical_eof;
			advf->rsrcfork.fork_exists = 1;
		}
	}

	advf->userdata = (void*)ectx;
	advf->writefork_cbfn = my_advfile_cbfn;

	if(rd->name_srd) {
		de_advfile_set_orig_filename(advf, rd->name_srd->sz,
			rd->name_srd->sz_strlen);
	}

	de_advfile_run(advf);

	de_free(c, ectx->fki_data);
	de_free(c, ectx->fki_rsrc);
	de_free(c, ectx);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x8(%rbp), %rdi
movl $0x20, %esi
callq 0x15b780
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rcx
movq -0x40(%rbp), %rax
movq %rcx, (%rax)
movq -0x20(%rbp), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rdi
movl $0x50, %esi
callq 0x15b780
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rdi
movl $0x50, %esi
callq 0x15b780
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movb $0x1, (%rax)
movq -0x30(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x30(%rbp), %rsi
callq 0x165170
movzbl %al, %eax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rax
movl %eax, %edx
leaq 0x132075(%rip), %rsi    # 0x1ac940
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x30(%rbp), %rsi
callq 0x165170
movzbl %al, %eax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rax
movl %eax, %edx
leaq 0x132052(%rip), %rsi    # 0x1ac94d
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rdx
movq -0x30(%rbp), %rcx
callq 0x7adc0
movq -0x30(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x30(%rbp), %rsi
callq 0x165210
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movl %eax, %edx
leaq 0x131ff0(%rip), %rsi    # 0x1ac958
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x30(%rbp), %rsi
callq 0x1654b0
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movl %eax, %edx
leaq 0x131fce(%rip), %rsi    # 0x1ac976
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x30(%rbp), %rsi
callq 0x1654b0
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x18(%rax)
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rax), %rax
movl %eax, %edx
leaq 0x131fa8(%rip), %rsi    # 0x1ac990
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x30(%rbp), %rsi
callq 0x165210
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movl %eax, %edx
leaq 0x131f83(%rip), %rsi    # 0x1ac9ab
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x30(%rbp), %rsi
callq 0x1654b0
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x10(%rax), %rax
movl %eax, %edx
leaq 0x131f61(%rip), %rsi    # 0x1ac9c9
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x30(%rbp), %rsi
callq 0x1654b0
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x18(%rax)
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x18(%rax), %rax
movl %eax, %edx
leaq 0x131f3b(%rip), %rsi    # 0x1ac9e3
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rcx
callq 0x7ad10
movq -0x30(%rbp), %rax
addq $0xc, %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x30(%rbp), %rsi
callq 0x165210
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rax
movl %eax, %edx
leaq 0x131ef8(%rip), %rsi    # 0x1ac9fe
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x30(%rbp), %rdx
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rcx
addq $0x20, %rcx
movl $0x3, %r8d
leaq 0x131edb(%rip), %r9     # 0x1aca0d
callq 0x79570
movq -0x30(%rbp), %rax
addq $0xc, %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x30(%rbp), %rdx
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rcx
addq $0x20, %rcx
movl $0x3, %r8d
leaq 0x131eaf(%rip), %r9     # 0x1aca17
callq 0x79570
movq -0x30(%rbp), %rax
addq $0xc, %rax
movq %rax, -0x30(%rbp)
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
cmpq $0x0, 0x10(%rax)
setg %al
andb $0x1, %al
movzbl %al, %eax
movb %al, %cl
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movb %cl, 0x1(%rax)
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rcx
movb $0x1, %al
cmpq $0x0, 0x10(%rcx)
movb %al, -0x41(%rbp)
jg 0x7abc3
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
cmpb $0x0, 0x1(%rax)
setne %al
xorb $-0x1, %al
movb %al, -0x41(%rbp)
movb -0x41(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
movb %al, %cl
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movb %cl, 0x1(%rax)
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
cmpb $0x0, 0x1(%rax)
je 0x7ac2b
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rcx
callq 0x7aef0
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
cmpb $0x0, 0x2(%rax)
jne 0x7ac29
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x28(%rbp), %rax
movb $0x1, 0x10(%rax)
jmp 0x7ac2b
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
cmpb $0x0, 0x1(%rax)
je 0x7ac7e
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rcx
callq 0x7aef0
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
cmpb $0x0, 0x2(%rax)
jne 0x7ac7c
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x10(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x28(%rbp), %rax
movb $0x1, 0x38(%rax)
jmp 0x7ac7e
movq -0x40(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rax
leaq 0x30b(%rip), %rcx       # 0x7afa0
movq %rcx, 0x60(%rax)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0x7acc5
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rsi
movq -0x20(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x10(%rax), %rdx
callq 0x17ab20
movq -0x28(%rbp), %rdi
callq 0x17ac20
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x15b820
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rsi
callq 0x15b820
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rsi
callq 0x15b820
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)