// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/zip.c
// Function: zip_wcd_run
static void zip_wcd_run(deark *c, struct zip_wcd_ctx *wcdctx)
{
	i64 pos;

	pos = wcdctx->inf_start_pos;
	wcdctx->inf_end_of_last_completed_entry = pos;

	while(1) {
		u32 sig;
		i64 len_avail;

		if(wcdctx->errflag) goto done;
		if(wcdctx->num_entries_completed >= wcdctx->max_entries) goto done;

		wcdctx->entry_pos = pos;
		len_avail = wcdctx->inf->len - wcdctx->entry_pos;
		if(len_avail < 46) {
			// Not enough space even for the invariant part of the entry
			if(!wcdctx->multisegment_mode) {
				wcdctx->errflag = 1;
			}
			goto done;
		}
		sig=(u32)dbuf_getu32be(wcdctx->inf, pos);
		if(sig==0 && wcdctx->multisegment_mode) {
			// I haven't seen this, but I think it makes sense to tolerate
			// zero-padding.
			goto done;
		}
		if(sig!=CODE_PK12) {
			wcdctx->errflag = 1;
			goto done;
		}
		wcdctx->fn_len = dbuf_getu16le(wcdctx->inf, pos+28);
		wcdctx->extra_len = dbuf_getu16le(wcdctx->inf, pos+30);
		wcdctx->comment_len = dbuf_getu16le(wcdctx->inf, pos+32);
		wcdctx->entry_size = 46 + wcdctx->fn_len + wcdctx->extra_len +
			wcdctx->comment_len;
		if(wcdctx->entry_size > len_avail) {
			if(!wcdctx->multisegment_mode) {
				wcdctx->errflag = 1;
			}
			goto done;
		}
		if(wcdctx->cbfn) {
			wcdctx->cbfn(c, wcdctx);
			if(wcdctx->errflag) goto done;
		}

		pos += wcdctx->entry_size;
		wcdctx->num_entries_completed++;
		wcdctx->inf_end_of_last_completed_entry = pos;
	}

done:
	wcdctx->entry_pos = 0;
	wcdctx->entry_size = 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
cmpb $0x0, 0x14(%rax)
je 0x148867
jmp 0x148a02
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x28(%rcx), %rax
jl 0x14887e
jmp 0x148a02
movq -0x18(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x18(%rax), %rax
movq -0x10(%rbp), %rcx
subq 0x40(%rcx), %rax
movq %rax, -0x28(%rbp)
cmpq $0x2e, -0x28(%rbp)
jge 0x1488c0
movq -0x10(%rbp), %rax
cmpb $0x0, 0x15(%rax)
jne 0x1488bb
movq -0x10(%rbp), %rax
movb $0x1, 0x14(%rax)
jmp 0x148a02
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0x165470
movl %eax, -0x1c(%rbp)
cmpl $0x0, -0x1c(%rbp)
jne 0x1488ec
movq -0x10(%rbp), %rax
movzbl 0x15(%rax), %eax
cmpl $0x0, %eax
je 0x1488ec
jmp 0x148a02
cmpl $0x504b0102, -0x1c(%rbp) # imm = 0x504B0102
je 0x148902
movq -0x10(%rbp), %rax
movb $0x1, 0x14(%rax)
jmp 0x148a02
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rsi
addq $0x1c, %rsi
callq 0x165280
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x50(%rax)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rsi
addq $0x1e, %rsi
callq 0x165280
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x58(%rax)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rsi
addq $0x20, %rsi
callq 0x165280
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x60(%rax)
movq -0x10(%rbp), %rax
movq 0x50(%rax), %rcx
addq $0x2e, %rcx
movq -0x10(%rbp), %rax
addq 0x58(%rax), %rcx
movq -0x10(%rbp), %rax
addq 0x60(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x48(%rax)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
cmpq -0x28(%rbp), %rax
jle 0x1489a8
movq -0x10(%rbp), %rax
cmpb $0x0, 0x15(%rax)
jne 0x1489a6
movq -0x10(%rbp), %rax
movb $0x1, 0x14(%rax)
jmp 0x148a02
movq -0x10(%rbp), %rax
cmpq $0x0, (%rax)
je 0x1489d1
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq *%rax
movq -0x10(%rbp), %rax
cmpb $0x0, 0x14(%rax)
je 0x1489cf
jmp 0x148a02
jmp 0x1489d1
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
addq -0x18(%rbp), %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x30(%rax)
movq -0x18(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x38(%rax)
jmp 0x148858
movq -0x10(%rbp), %rax
movq $0x0, 0x40(%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x48(%rax)
addq $0x30, %rsp
popq %rbp
retq