// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/hlp.c
// Function: do_topiclink
static int do_topiclink(deark *c, lctx *d, struct topic_ctx *tctx, i64 pos1, u32 *next_pos_code)
{
	struct topiclink_data *tld = NULL;
	i64 pos = pos1;
	i64 linkdata2_nbytes_avail;
	int retval = 0;
	dbuf *inf = tctx->unc_topicdata;
	char tmpbuf[24];

	tld = de_malloc(c, sizeof(struct topiclink_data));

	tld->blocksize = dbuf_geti32le_p(inf, &pos);
	de_dbg(c, "blocksize: %"I64_FMT, tld->blocksize);
	if((tld->blocksize<21) || (pos1 + tld->blocksize > inf->len)) {
		de_dbg(c, "bad topiclink blocksize");
		goto done;
	}
	tld->datalen2 = dbuf_geti32le_p(inf, &pos);
	de_dbg(c, "datalen2 (after any decompression): %"I64_FMT, tld->datalen2);

	tld->prevblock = (u32)dbuf_getu32le_p(inf, &pos);
	format_topiclink(c, d, tld->prevblock, tmpbuf, sizeof(tmpbuf));
	de_dbg(c, "prevblock: %s", tmpbuf);

	tld->nextblock = (u32)dbuf_getu32le_p(inf, &pos);
	format_topiclink(c, d, tld->nextblock, tmpbuf, sizeof(tmpbuf));
	de_dbg(c, "nextblock: %s", tmpbuf);
	*next_pos_code = (u32)tld->nextblock;
	retval = 1;

	tld->datalen1 = dbuf_geti32le_p(inf, &pos);
	de_dbg(c, "datalen1: %"I64_FMT, tld->datalen1);
	tld->recordtype = dbuf_getbyte_p(inf, &pos);
	de_dbg(c, "record type: %d", (int)tld->recordtype);

	tld->linkdata1_pos = pos1 + 21;
	tld->linkdata1_len = tld->datalen1 - 21;
	de_dbg(c, "linkdata1: pos=[%"I64_FMT"], len=%"I64_FMT, tld->linkdata1_pos, tld->linkdata1_len);

	tld->linkdata2_pos = tld->linkdata1_pos + tld->linkdata1_len;
	linkdata2_nbytes_avail = tld->blocksize - tld->datalen1;

	if(d->uses_old_phrase_compression || d->uses_hall_compression) {
		if(tld->datalen2 > linkdata2_nbytes_avail) {
			// Phrase/Hall compression used in this topiclink
			tld->seems_compressed = 1;
			tld->linkdata2_cmprlen = linkdata2_nbytes_avail;
			tld->linkdata2_uncmprlen = tld->datalen2;
		}
		else {
			// Phrase/Hall compression used in this file, but not in this topiclink
			tld->linkdata2_cmprlen = tld->datalen2;
			tld->linkdata2_uncmprlen = tld->datalen2;
		}
	}
	else {
		// Phrase/Hall compression not used in this file
		tld->linkdata2_cmprlen = de_min_int(tld->datalen2, linkdata2_nbytes_avail);
		tld->linkdata2_uncmprlen = tld->linkdata2_cmprlen;
	}

	if((tld->linkdata1_pos<pos1) || (tld->linkdata2_pos<pos1) ||
		(tld->linkdata1_len<0) || (tld->linkdata2_cmprlen<0) ||
		(tld->linkdata1_pos + tld->linkdata1_len > pos1+tld->blocksize) ||
		(tld->linkdata2_pos + tld->linkdata2_cmprlen > pos1+tld->blocksize))
	{
		de_dbg(c, "bad linkdata");
		goto done;
	}

	de_dbg(c, "linkdata2: pos=[%"I64_FMT"], cmprlen=%"I64_FMT", uncmprlen=%"I64_FMT,
		tld->linkdata2_pos, tld->linkdata2_cmprlen, tld->linkdata2_uncmprlen);

	// Decompress linkdata2 if necessary
	dbuf_truncate(d->unc_linkdata2_dbuf, 0);
	if(tld->seems_compressed && d->uses_old_phrase_compression) {
		do_phrase_decompression(c, d, inf, tld->linkdata2_pos, tld->linkdata2_cmprlen,
			d->unc_linkdata2_dbuf, tld->linkdata2_uncmprlen);
	}
	else if(tld->seems_compressed && d->uses_hall_compression) {
		do_hall_decompression(c, d, inf, tld->linkdata2_pos, tld->linkdata2_cmprlen,
			d->unc_linkdata2_dbuf,tld->linkdata2_uncmprlen);
	}
	else {
		dbuf_copy(inf, tld->linkdata2_pos, tld->linkdata2_cmprlen, d->unc_linkdata2_dbuf);
	}

	switch(tld->recordtype) {
	case 1:
	case 32:
	case 35:
		do_topiclink_rectype_1_32(c, d, tctx, tld, d->unc_linkdata2_dbuf);
		break;
	case 2:
		do_topiclink_rectype_2(c, d, tctx, tld, d->unc_linkdata2_dbuf);
		break;
	default:
		de_warn(c, "Unsupported record type: %d", (int)tld->recordtype);
	}

done:
	de_free(c, tld);
	return retval;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x38(%rbp)
movl $0x0, -0x44(%rbp)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x50(%rbp)
movq -0x8(%rbp), %rdi
movl $0x60, %esi
callq 0x15b780
movq %rax, -0x30(%rbp)
movq -0x50(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x165670
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rax
movq (%rax), %rdx
leaq 0x12f87f(%rip), %rsi    # 0x1ad1ec
movb $0x0, %al
callq 0x15b0d0
movq -0x30(%rbp), %rax
cmpq $0x15, (%rax)
jl 0x7d993
movq -0x20(%rbp), %rax
movq -0x30(%rbp), %rcx
addq (%rcx), %rax
movq -0x50(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jle 0x7d9aa
movq -0x8(%rbp), %rdi
leaq 0x12f85d(%rip), %rsi    # 0x1ad1fb
movb $0x0, %al
callq 0x15b0d0
jmp 0x7de11
movq -0x50(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x165670
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rdx
leaq 0x12f83e(%rip), %rsi    # 0x1ad213
movb $0x0, %al
callq 0x15b0d0
movq -0x50(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x165580
movl %eax, %ecx
movq -0x30(%rbp), %rax
movl %ecx, 0x10(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x30(%rbp), %rax
movl 0x10(%rax), %edx
leaq -0x70(%rbp), %rcx
movl $0x18, %r8d
callq 0x7d5b0
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rdx
leaq 0x12f81c(%rip), %rsi    # 0x1ad23b
movb $0x0, %al
callq 0x15b0d0
movq -0x50(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x165580
movl %eax, %ecx
movq -0x30(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x30(%rbp), %rax
movl 0x14(%rax), %edx
leaq -0x70(%rbp), %rcx
movl $0x18, %r8d
callq 0x7d5b0
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rdx
leaq 0x12f7e0(%rip), %rsi    # 0x1ad249
movb $0x0, %al
callq 0x15b0d0
movq -0x30(%rbp), %rax
movl 0x14(%rax), %ecx
movq -0x28(%rbp), %rax
movl %ecx, (%rax)
movl $0x1, -0x44(%rbp)
movq -0x50(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x165670
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rdx
leaq 0x12f7a8(%rip), %rsi    # 0x1ad257
movb $0x0, %al
callq 0x15b0d0
movq -0x50(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x165170
movb %al, %cl
movq -0x30(%rbp), %rax
movb %cl, 0x20(%rax)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rax
movzbl 0x20(%rax), %edx
leaq 0x12f7ee(%rip), %rsi    # 0x1ad2cd
movb $0x0, %al
callq 0x15b0d0
movq -0x20(%rbp), %rcx
addq $0x15, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rcx
subq $0x15, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rdx
movq -0x30(%rbp), %rax
movq 0x30(%rax), %rcx
leaq 0x12f740(%rip), %rsi    # 0x1ad265
movb $0x0, %al
callq 0x15b0d0
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rcx
movq -0x30(%rbp), %rax
addq 0x30(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x30(%rbp), %rax
movq (%rax), %rax
movq -0x30(%rbp), %rcx
subq 0x18(%rcx), %rax
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
cmpl $0x0, 0x9c(%rax)
jne 0x7db71
movq -0x10(%rbp), %rax
cmpl $0x0, 0xa0(%rax)
je 0x7dbc7
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
cmpq -0x40(%rbp), %rax
jle 0x7dba5
movq -0x30(%rbp), %rax
movb $0x1, 0x58(%rax)
movq -0x40(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x48(%rax)
jmp 0x7dbc5
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x48(%rax)
jmp 0x7dbf3
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x40(%rbp), %rsi
callq 0x15ccf0
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x30(%rbp), %rax
movq 0x40(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x48(%rax)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
cmpq -0x20(%rbp), %rax
jl 0x7dc65
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rax
cmpq -0x20(%rbp), %rax
jl 0x7dc65
movq -0x30(%rbp), %rax
cmpq $0x0, 0x30(%rax)
jl 0x7dc65
movq -0x30(%rbp), %rax
cmpq $0x0, 0x40(%rax)
jl 0x7dc65
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x30(%rbp), %rcx
addq 0x30(%rcx), %rax
movq -0x20(%rbp), %rcx
movq -0x30(%rbp), %rdx
addq (%rdx), %rcx
cmpq %rcx, %rax
jg 0x7dc65
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x30(%rbp), %rcx
addq 0x40(%rcx), %rax
movq -0x20(%rbp), %rcx
movq -0x30(%rbp), %rdx
addq (%rdx), %rcx
cmpq %rcx, %rax
jle 0x7dc7c
movq -0x8(%rbp), %rdi
leaq 0x12f613(%rip), %rsi    # 0x1ad283
movb $0x0, %al
callq 0x15b0d0
jmp 0x7de11
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rdx
movq -0x30(%rbp), %rax
movq 0x40(%rax), %rcx
movq -0x30(%rbp), %rax
movq 0x48(%rax), %r8
leaq 0x12f5f1(%rip), %rsi    # 0x1ad290
movb $0x0, %al
callq 0x15b0d0
movq -0x10(%rbp), %rax
movq 0xd8(%rax), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x168900
movq -0x30(%rbp), %rax
movzbl 0x58(%rax), %eax
cmpl $0x0, %eax
je 0x7dd0e
movq -0x10(%rbp), %rax
cmpl $0x0, 0x9c(%rax)
je 0x7dd0e
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x50(%rbp), %rdx
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rcx
movq -0x30(%rbp), %rax
movq 0x40(%rax), %r8
movq -0x10(%rbp), %rax
movq 0xd8(%rax), %r9
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rax
movq %rax, (%rsp)
callq 0x7df50
jmp 0x7dd88
movq -0x30(%rbp), %rax
movzbl 0x58(%rax), %eax
cmpl $0x0, %eax
je 0x7dd62
movq -0x10(%rbp), %rax
cmpl $0x0, 0xa0(%rax)
je 0x7dd62
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x50(%rbp), %rdx
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rcx
movq -0x30(%rbp), %rax
movq 0x40(%rax), %r8
movq -0x10(%rbp), %rax
movq 0xd8(%rax), %r9
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rax
movq %rax, (%rsp)
callq 0x7e050
jmp 0x7dd86
movq -0x50(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rsi
movq -0x30(%rbp), %rax
movq 0x40(%rax), %rdx
movq -0x10(%rbp), %rax
movq 0xd8(%rax), %rcx
callq 0x166070
jmp 0x7dd88
movq -0x30(%rbp), %rax
movzbl 0x20(%rax), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x78(%rbp)
subl $0x22, %eax
ja 0x7ddf5
movq -0x78(%rbp), %rax
leaq 0x12ee04(%rip), %rcx    # 0x1acbac
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x30(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0xd8(%rax), %r8
callq 0x7e1f0
jmp 0x7de0f
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x30(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0xd8(%rax), %r8
callq 0x7e3b0
jmp 0x7de0f
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rax
movzbl 0x20(%rax), %edx
leaq 0x12f4b9(%rip), %rsi    # 0x1ad2c1
movb $0x0, %al
callq 0x15bc10
jmp 0x7de11
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x15b820
movl -0x44(%rbp), %eax
addq $0x80, %rsp
popq %rbp
retq
nopw (%rax,%rax)