// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/exectext.c
// Function: de_run_texe
static void de_run_texe(deark *c, de_module_params *mparams)
{
	struct texe_ctx *tctx = NULL;
	lctx *d = NULL;
	dbuf *tmpdbuf = NULL;

	d = create_lctx(c);

	tctx = de_malloc(c, sizeof(struct texe_ctx));
	tctx->msgpfx = "[TEXE] ";
	tctx->ei = de_malloc(c, sizeof(struct fmtutil_exe_info));

	exectext_set_common_enc_opts(c, d, DE_ENCODING_CP437);

	d->chartypes[10] = ETCT_CONTROL;
	d->chartypes[13] = ETCT_CONTROL;

	fmtutil_collect_exe_info(c, c->infile, tctx->ei);

	tctx->edd.restrict_to_fmt = DE_SPECIALEXEFMT_TEXE;
	fmtutil_detect_specialexe(c, tctx->ei, &tctx->edd);
	if(tctx->edd.detected_fmt!=DE_SPECIALEXEFMT_TEXE) {
		d->need_errmsg = 1;
		goto done;
	}

	if(tctx->ei->overlay_len<2 || tctx->ei->overlay_len > 640*1024) {
		d->need_errmsg = 1;
		goto done;
	}

	texe_find_text(c, tctx, d);
	if(d->errflag) goto done;

	if(tctx->use_cr_hack) {
		// The first byte of the file seems lost, due to an apparent bug in
		// TEXE.
		// But if the second byte is LF, we assume the first byte was CR, and
		// can fix it.
		// (Here we make a modified copy of the data.)
		tmpdbuf = dbuf_create_membuf(c, d->tlen, 0);
		dbuf_writebyte(tmpdbuf, 0x0d);
		dbuf_copy(c->infile, d->tpos+1, d->tlen-1, tmpdbuf);
		dbuf_flush(tmpdbuf);
		d->inf = tmpdbuf;
		d->tpos = 0;
	}

	exectext_extract_default(c, d);

done:
	if(d) {
		if(d->need_errmsg && tctx) {
			de_err(c, "%sBad or unsupported TEXE file", tctx->msgpfx);
		}
		de_free(c, d);
		d = NULL;
	}
	if(tctx) {
		de_free(c, tctx->ei);
		de_free(c, tctx);
		tctx = NULL;
	}
	dbuf_close(tmpdbuf);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq $0x0, -0x18(%rbp)
movq $0x0, -0x20(%rbp)
movq $0x0, -0x28(%rbp)
movq -0x8(%rbp), %rdi
callq 0x8dcb0
movq %rax, -0x20(%rbp)
movq -0x8(%rbp), %rdi
movl $0x90, %esi
callq 0x15b780
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
leaq 0x12235f(%rip), %rcx    # 0x1af641
movq %rcx, (%rax)
movq -0x8(%rbp), %rdi
movl $0xf0, %esi
callq 0x15b780
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
movl $0xd, %edx
callq 0x8dcf0
movq -0x20(%rbp), %rax
movb $0x1, 0x42(%rax)
movq -0x20(%rbp), %rax
movb $0x1, 0x45(%rax)
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdx
callq 0x188930
movq -0x18(%rbp), %rax
movb $-0x35, 0x18(%rax)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x18(%rbp), %rdx
addq $0x18, %rdx
callq 0x189890
movq -0x18(%rbp), %rax
movzbl 0x19(%rax), %eax
cmpl $0xcb, %eax
je 0x8d376
movq -0x20(%rbp), %rax
movb $0x1, 0x13(%rax)
jmp 0x8d44a
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x2, 0x50(%rax)
jl 0x8d397
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0xa0000, 0x50(%rax)    # imm = 0xA0000
jle 0x8d3a4
movq -0x20(%rbp), %rax
movb $0x1, 0x13(%rax)
jmp 0x8d44a
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x8fa10
movq -0x20(%rbp), %rax
cmpb $0x0, 0x12(%rax)
je 0x8d3c4
jmp 0x8d44a
movq -0x18(%rbp), %rax
cmpb $0x0, 0x8(%rax)
je 0x8d43d
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x30(%rax), %rsi
xorl %edx, %edx
callq 0x168020
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
movl $0xd, %esi
callq 0x168380
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rsi
addq $0x1, %rsi
movq -0x20(%rbp), %rax
movq 0x30(%rax), %rdx
subq $0x1, %rdx
movq -0x28(%rbp), %rcx
callq 0x166070
movq -0x28(%rbp), %rdi
callq 0x167c30
movq -0x28(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x20(%rbp), %rax
movq $0x0, 0x28(%rax)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x8df30
cmpq $0x0, -0x20(%rbp)
je 0x8d493
movq -0x20(%rbp), %rax
movzbl 0x13(%rax), %eax
cmpl $0x0, %eax
je 0x8d47e
cmpq $0x0, -0x18(%rbp)
je 0x8d47e
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
leaq 0x1221d2(%rip), %rsi    # 0x1af649
movb $0x0, %al
callq 0x15bfb0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x15b820
movq $0x0, -0x20(%rbp)
cmpq $0x0, -0x18(%rbp)
je 0x8d4c0
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x15b820
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x15b820
movq $0x0, -0x18(%rbp)
movq -0x28(%rbp), %rdi
callq 0x1676a0
addq $0x30, %rsp
popq %rbp
retq
nop