// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/aldus.c
// Function: aldus_main
static void aldus_main(deark *c, de_module_params *mparams, UI fmtcode)
{
	lctx *d = NULL;
	i64 pos;
	i64 n;
	u8 frag_flag = 0;

	d = de_malloc(c, sizeof(lctx));
	d->fmtcode = fmtcode;
	d->rfork.is_rsrc_fork = 1;
	d->dfork.forkname = "data";
	d->rfork.forkname = "resource";

	d->advf = de_advfile_create(c);
	d->advf->userdata = (void*)d;
	d->advf->enable_wbuffer = 1;

	// For lack of a better idea, this is how we distinguish Mac and PC formats.
	if(d->fmtcode==1 && de_getbyte(60)!=0 && de_getbyte(64)!=0) {
		d->has_4cc_codes = 1;
	}

	d->input_encoding = de_get_input_encoding(c, NULL,
		(d->has_4cc_codes?DE_ENCODING_MACROMAN:DE_ENCODING_WINDOWS1252));

	d->fork1pos = de_getu16be(16);
	de_dbg(c, "first fork pos: %"I64_FMT, d->fork1pos);
	if(d->fork1pos<100) {
		d->need_errmsg = 1;
		goto done;
	}

	d->fname = dbuf_read_string(c->infile, 18, 32, 32, DE_CONVFLAG_STOP_AT_NUL,
		d->input_encoding);
	de_dbg(c, "filename: \"%s\"", ucstring_getpsz_d(d->fname->str));

	pos = 50;
	d->total_orig_len = de_getu32be_p(&pos);
	de_dbg(c, "orig len (sum of all forks): %"I64_FMT, d->total_orig_len);

	read_timestamp(c, d); // offset 54 or 68

	if(d->has_4cc_codes) {
		read_typecreator_codes(c, d, 60);
	}

	n = de_getu32be(78);
	if(n != d->fork1pos) {
		// The 2-byte field at offset 16, and the 4(?)-byte field at offset 78,
		// are always the same. Either 100 or 200.
		// So I don't know which is the one I want.
		d->need_errmsg = 1;
		goto done;
	}

	if(d->fmtcode==1) {
		d->no_dfork_flag = de_getbyte(82);
	}

	if(d->fmtcode==2) {
		frag_flag = de_getbyte(98);
	}
	if(frag_flag) {
		de_err(c, "Unsupported type of file (fragmented?)");
		goto done;
	}

	if(d->no_dfork_flag) {
		d->rfork.pos = d->fork1pos;
		aldus_read_fork(c, d, &d->rfork);
		if(d->errflag) goto done;
	}
	else {
		// We're assuming that if both forks exist, the data fork is always
		// first.
		d->dfork.pos = d->fork1pos;
		aldus_read_fork(c, d, &d->dfork);
		if(d->errflag) goto done;

		if(d->found_rsrc_fork) {
			aldus_read_fork(c, d, &d->rfork);
			if(d->errflag) goto done;
		}
	}

	ucstring_append_ucstring(d->advf->filename, d->fname->str);
	d->advf->original_filename_flag = 1;

	de_advfile_set_orig_filename(d->advf, d->fname->sz,
		d->fname->sz_strlen);

	if(!d->dfork.fork_exists && !d->rfork.fork_exists) goto done;

	if(d->dfork.fork_exists) {
		d->advf->mainfork.fork_exists = 1;
		d->advf->mainfork.fork_len = d->dfork.orig_len;
	}
	if(d->rfork.fork_exists) {
		d->advf->rsrcfork.fork_exists = 1;
		d->advf->rsrcfork.fork_len = d->rfork.orig_len;
	}

	d->advf->writefork_cbfn = my_advfile_cbfn;

	de_advfile_run(d->advf);

done:
	if(d) {
		if(d->need_errmsg) {
			de_err(c, "Bad or unsupported file");
		}
		de_advfile_destroy(d->advf);
		destroy_fork_contents(c, &d->dfork);
		destroy_fork_contents(c, &d->rfork);
		de_destroy_stringreaderdata(c, d->fname);
		de_free(c, d);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq $0x0, -0x20(%rbp)
movb $0x0, -0x31(%rbp)
movq -0x8(%rbp), %rdi
movl $0x110, %esi            # imm = 0x110
callq 0x15b780
movq %rax, -0x20(%rbp)
movl -0x14(%rbp), %ecx
movq -0x20(%rbp), %rax
movl %ecx, (%rax)
movq -0x20(%rbp), %rax
movb $0x1, 0x91(%rax)
movq -0x20(%rbp), %rax
leaq 0x178239(%rip), %rcx    # 0x1c5b79
movq %rcx, 0xe8(%rax)
movq -0x20(%rbp), %rax
leaq 0x16eaae(%rip), %rcx    # 0x1bc400
movq %rcx, 0xa8(%rax)
movq -0x8(%rbp), %rdi
callq 0x17aa20
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x20(%rbp), %rcx
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movb $0x1, 0x78(%rax)
movq -0x20(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x4d9ce
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x3c, %esi
callq 0x165060
movzbl %al, %eax
cmpl $0x0, %eax
je 0x4d9ce
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x40, %esi
callq 0x165060
movzbl %al, %eax
cmpl $0x0, %eax
je 0x4d9ce
movq -0x20(%rbp), %rax
movb $0x1, 0xa(%rax)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movzbl 0xa(%rax), %ecx
movl $0x9, %edx
movl $0x11, %eax
cmpl $0x0, %ecx
cmovnel %eax, %edx
xorl %eax, %eax
movl %eax, %esi
callq 0x15e4a0
movl %eax, %ecx
movq -0x20(%rbp), %rax
movl %ecx, 0x4(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x10, %esi
callq 0x1651d0
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0x1571a7(%rip), %rsi    # 0x1a4bd3
movb $0x0, %al
callq 0x15b0d0
movq -0x20(%rbp), %rax
cmpq $0x64, 0x10(%rax)
jge 0x4da4b
movq -0x20(%rbp), %rax
movb $0x1, 0x9(%rax)
jmp 0x4dd45
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x20(%rbp), %rax
movl 0x4(%rax), %r9d
movl $0x12, %esi
movl $0x20, %ecx
movl $0x1, %r8d
movq %rcx, %rdx
callq 0x1664c0
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x18(%rax), %rdi
callq 0x172650
movq -0x40(%rbp), %rdi
movq %rax, %rdx
leaq 0x179ade(%rip), %rsi    # 0x1c7583
movb $0x0, %al
callq 0x15b0d0
movq $0x32, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x1654b0
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x18(%rax), %rdx
leaq 0x157104(%rip), %rsi    # 0x1a4be7
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x4ddd0
movq -0x20(%rbp), %rax
cmpb $0x0, 0xa(%rax)
je 0x4db13
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
movl $0x3c, %edx
callq 0x4df10
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x4e, %esi
callq 0x165470
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq 0x10(%rcx), %rax
je 0x4db44
movq -0x20(%rbp), %rax
movb $0x1, 0x9(%rax)
jmp 0x4dd45
movq -0x20(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x4db68
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x52, %esi
callq 0x165060
movb %al, %cl
movq -0x20(%rbp), %rax
movb %cl, 0xb(%rax)
movq -0x20(%rbp), %rax
cmpl $0x2, (%rax)
jne 0x4db86
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x62, %esi
callq 0x165060
movb %al, -0x31(%rbp)
cmpb $0x0, -0x31(%rbp)
je 0x4dba3
movq -0x8(%rbp), %rdi
leaq 0x157071(%rip), %rsi    # 0x1a4c08
movb $0x0, %al
callq 0x15bfb0
jmp 0x4dd45
movq -0x20(%rbp), %rax
cmpb $0x0, 0xb(%rax)
je 0x4dbe9
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x98(%rax)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x20(%rbp), %rdx
addq $0x90, %rdx
callq 0x4dff0
movq -0x20(%rbp), %rax
cmpb $0x0, 0x8(%rax)
je 0x4dbe7
jmp 0x4dd45
jmp 0x4dc58
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0xd8(%rax)
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x20(%rbp), %rdx
addq $0xd0, %rdx
callq 0x4dff0
movq -0x20(%rbp), %rax
cmpb $0x0, 0x8(%rax)
je 0x4dc23
jmp 0x4dd45
movq -0x20(%rbp), %rax
cmpb $0x0, 0xc(%rax)
je 0x4dc56
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x20(%rbp), %rdx
addq $0x90, %rdx
callq 0x4dff0
movq -0x20(%rbp), %rax
cmpb $0x0, 0x8(%rax)
je 0x4dc54
jmp 0x4dd45
jmp 0x4dc56
jmp 0x4dc58
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movq 0x68(%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x18(%rax), %rsi
callq 0x171460
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movb $0x1, 0x79(%rax)
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x8(%rax), %rsi
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x10(%rax), %rdx
callq 0x17ab20
movq -0x20(%rbp), %rax
cmpb $0x0, 0xd0(%rax)
jne 0x4dcc5
movq -0x20(%rbp), %rax
cmpb $0x0, 0x90(%rax)
jne 0x4dcc5
jmp 0x4dd45
movq -0x20(%rbp), %rax
cmpb $0x0, 0xd0(%rax)
je 0x4dcf5
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movb $0x1, 0x10(%rax)
movq -0x20(%rbp), %rax
movq 0xe0(%rax), %rcx
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movq %rcx, 0x18(%rax)
movq -0x20(%rbp), %rax
cmpb $0x0, 0x90(%rax)
je 0x4dd25
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movb $0x1, 0x38(%rax)
movq -0x20(%rbp), %rax
movq 0xa0(%rax), %rcx
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movq %rcx, 0x40(%rax)
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
leaq 0x6fc(%rip), %rcx       # 0x4e430
movq %rcx, 0x60(%rax)
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x17ac20
cmpq $0x0, -0x20(%rbp)
je 0x4ddbb
movq -0x20(%rbp), %rax
cmpb $0x0, 0x9(%rax)
je 0x4dd68
movq -0x8(%rbp), %rdi
leaq 0x156ece(%rip), %rsi    # 0x1a4c2f
movb $0x0, %al
callq 0x15bfb0
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x17aaa0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
addq $0xd0, %rsi
callq 0x4e4c0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
addq $0x90, %rsi
callq 0x4e4c0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rsi
callq 0x166830
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x15b820
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)