// File: /workspace/github_c_makefile_star2_O0/jsummers[P]deark/modules/ogg.c
// Function: do_ogg_page
static int do_ogg_page(deark *c, lctx *d, i64 pos1, i64 *bytes_consumed)
{
	i64 pos = pos1;
	i64 x;
	i64 num_page_segments;
	i64 k;
	char buf[100];
	int retval = 0;
	int ret;
	void *item = NULL;
	struct stream_info *si = NULL;
	struct page_info *pgi = NULL;

	pgi = de_malloc(c, sizeof(struct page_info));
	pos += 4; // signature, already read

	pgi->version = de_getbyte_p(&pos);
	de_dbg(c, "version: %d", (int)pgi->version);

	pgi->hdr_type = de_getbyte_p(&pos);
	de_dbg(c, "header type: 0x%02x%s", (unsigned int)pgi->hdr_type,
		get_hdrtype_descr(c, buf, sizeof(buf), pgi->hdr_type));

	pgi->granule_pos = de_geti64le(pos); pos += 8;
	de_dbg(c, "granule position: %"I64_FMT, pgi->granule_pos);

	pgi->stream_serialno = de_getu32le_p(&pos);
	de_dbg(c, "bitstream serial number: %"I64_FMT, pgi->stream_serialno);

	ret = de_inthashtable_get_item(c, d->streamtable, pgi->stream_serialno, &item);
	if(ret) {
		si = (struct stream_info*)item;
		// We've seen this stream before.
		de_dbg_indent(c, 1);
		de_dbg(c, "bitstream %"I64_FMT" type: %s", pgi->stream_serialno,
			si->sti?si->sti->name:"unknown");
		de_dbg_indent(c, -1);
	}
	else {
		// This the first page we've encountered of this stream.
		si = de_malloc(c, sizeof(struct stream_info));
		de_inthashtable_add_item(c, d->streamtable, pgi->stream_serialno, (void*)si);
		d->bitstream_count++;
	}
	si->serialno = pgi->stream_serialno;

	pgi->page_seq_num = de_getu32le_p(&pos);
	de_dbg(c, "page sequence number: %"I64_FMT, pgi->page_seq_num);

	x = de_getu32le_p(&pos);
	de_dbg(c, "crc (reported): 0x%08x", (unsigned int)x);

	num_page_segments = (i64)de_getbyte_p(&pos);
	de_dbg(c, "number of page segments: %d", (int)num_page_segments);

	// Read page table
	pgi->dlen = 0;
	for(k=0; k<num_page_segments; k++) {
		x = (i64)de_getbyte_p(&pos);
		pgi->dlen += x;
	}

	pgi->dpos = pos;

	// Apparently we have 3 ways to identify the first page of a bitstream.
	// We'll require them all to be consistent.
	pgi->is_first_page = (si->page_count==0) && (pgi->page_seq_num==0) && ((pgi->hdr_type&0x02)!=0);

	// Page data
	de_dbg(c, "[%"I64_FMT" total bytes of page data, at %"I64_FMT"]", pgi->dlen, pgi->dpos);
	de_dbg_indent(c, 1);
	do_bitstream_page(c, d, pgi, si);
	de_dbg_indent(c, -1);

	pos += pgi->dlen;
	si->page_count++;

	*bytes_consumed = pos - pos1;
	retval = 1;

	de_free(c, pgi);
	return retval;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x28(%rbp)
movl $0x0, -0xb4(%rbp)
movq $0x0, -0xc0(%rbp)
movq $0x0, -0xc8(%rbp)
movq $0x0, -0xd0(%rbp)
movq -0x8(%rbp), %rdi
movl $0x30, %esi
callq 0x15b780
movq %rax, -0xd0(%rbp)
movq -0x28(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movb %al, %cl
movq -0xd0(%rbp), %rax
movb %cl, (%rax)
movq -0x8(%rbp), %rdi
movq -0xd0(%rbp), %rax
movzbl (%rax), %edx
leaq 0xf6c00(%rip), %rsi     # 0x1c0210
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movb %al, %cl
movq -0xd0(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x8(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0xd0(%rbp), %rax
movzbl 0x1(%rax), %eax
movl %eax, -0xd4(%rbp)
movq -0x8(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
movq -0xd0(%rbp), %rax
movl $0x64, %edx
movzbl 0x1(%rax), %ecx
callq 0xc9bc0
movq -0xe0(%rbp), %rdi
movl -0xd4(%rbp), %edx
movq %rax, %rcx
leaq 0xef359(%rip), %rsi     # 0x1b89e0
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x28(%rbp), %rsi
callq 0x1657e0
movq %rax, %rcx
movq -0xd0(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0xd0(%rbp), %rax
movq 0x8(%rax), %rdx
leaq 0xef327(%rip), %rsi     # 0x1b89f6
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165580
movq %rax, %rcx
movq -0xd0(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rdi
movq -0xd0(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0xef301(%rip), %rsi     # 0x1b8a0c
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0xd0(%rbp), %rax
movq 0x10(%rax), %rdx
leaq -0xc0(%rbp), %rcx
callq 0x15e700
movl %eax, -0xb8(%rbp)
cmpl $0x0, -0xb8(%rbp)
je 0xc97ea
movq -0xc0(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0x8(%rbp), %rdi
movl $0x1, %esi
callq 0x15b560
movq -0x8(%rbp), %rax
movq %rax, -0xf0(%rbp)
movq -0xd0(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0xe8(%rbp)
movq -0xc8(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0xc97a7
movq -0xc8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x18(%rax), %rax
movq %rax, -0xf8(%rbp)
jmp 0xc97b7
leaq 0xd4dae(%rip), %rax     # 0x19e55c
movq %rax, -0xf8(%rbp)
jmp 0xc97b7
movq -0xe8(%rbp), %rdx
movq -0xf0(%rbp), %rdi
movq -0xf8(%rbp), %rcx
leaq 0xef256(%rip), %rsi     # 0x1b8a29
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movl $0xffffffff, %esi       # imm = 0xFFFFFFFF
callq 0x15b560
jmp 0xc9832
movq -0x8(%rbp), %rdi
movl $0x30, %esi
callq 0x15b780
movq %rax, -0xc8(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0xd0(%rbp), %rax
movq 0x10(%rax), %rdx
movq -0xc8(%rbp), %rcx
callq 0x15e810
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x10(%rax)
movq -0xd0(%rbp), %rax
movq 0x10(%rax), %rcx
movq -0xc8(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165580
movq %rax, %rcx
movq -0xd0(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x8(%rbp), %rdi
movq -0xd0(%rbp), %rax
movq 0x18(%rax), %rdx
leaq 0xef1c3(%rip), %rsi     # 0x1b8a40
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165580
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rax
movl %eax, %edx
leaq 0x1064ee(%rip), %rsi    # 0x1cfd98
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movzbl %al, %eax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rax
movl %eax, %edx
leaq 0xef180(%rip), %rsi     # 0x1b8a5a
movb $0x0, %al
callq 0x15b0d0
movq -0xd0(%rbp), %rax
movq $0x0, 0x28(%rax)
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0xc993b
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x165170
movzbl %al, %eax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rcx
movq -0xd0(%rbp), %rax
addq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0xc98f8
movq -0x28(%rbp), %rcx
movq -0xd0(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0xc8(%rbp), %rcx
xorl %eax, %eax
cmpq $0x0, 0x18(%rcx)
movb %al, -0xf9(%rbp)
jne 0xc9990
movq -0xd0(%rbp), %rcx
xorl %eax, %eax
cmpq $0x0, 0x18(%rcx)
movb %al, -0xf9(%rbp)
jne 0xc9990
movq -0xd0(%rbp), %rax
movzbl 0x1(%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
setne %al
movb %al, -0xf9(%rbp)
movb -0xf9(%rbp), %al
andb $0x1, %al
movzbl %al, %ecx
movq -0xd0(%rbp), %rax
movl %ecx, 0x4(%rax)
movq -0x8(%rbp), %rdi
movq -0xd0(%rbp), %rax
movq 0x28(%rax), %rdx
movq -0xd0(%rbp), %rax
movq 0x20(%rax), %rcx
leaq 0xef0b0(%rip), %rsi     # 0x1b8a76
movb $0x0, %al
callq 0x15b0d0
movq -0x8(%rbp), %rdi
movl $0x1, %esi
callq 0x15b560
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0xd0(%rbp), %rdx
movq -0xc8(%rbp), %rcx
callq 0xc9cb0
movq -0x8(%rbp), %rdi
movl $0xffffffff, %esi       # imm = 0xFFFFFFFF
callq 0x15b560
movq -0xd0(%rbp), %rax
movq 0x28(%rax), %rax
addq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0xc8(%rbp), %rax
movq 0x18(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rax)
movq -0x28(%rbp), %rcx
subq -0x18(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movl $0x1, -0xb4(%rbp)
movq -0x8(%rbp), %rdi
movq -0xd0(%rbp), %rsi
callq 0x15b820
movl -0xb4(%rbp), %eax
addq $0x100, %rsp            # imm = 0x100
popq %rbp
retq
nopw %cs:(%rax,%rax)