// File: /workspace/github_c_makefile_star2_O1/icebert[P]pblat/htslib/cram/cram_io.c
// Function: cram_read_container
cram_container *cram_read_container(cram_fd *fd) {
    cram_container c2, *c;
    int i, s;
    size_t rd = 0;
    uint32_t crc = 0;
    
    fd->err = 0;
    fd->eof = 0;

    memset(&c2, 0, sizeof(c2));
    if (CRAM_MAJOR_VERS(fd->version) == 1) {
	if ((s = itf8_decode_crc(fd, &c2.length, &crc)) == -1) {
	    fd->eof = fd->empty_container ? 1 : 2;
	    return NULL;
	} else {
	    rd+=s;
	}
    } else {
	uint32_t len;
	if ((s = int32_decode(fd, &c2.length)) == -1) {
	    if (CRAM_MAJOR_VERS(fd->version) == 2 &&
		CRAM_MINOR_VERS(fd->version) == 0)
		fd->eof = 1; // EOF blocks arrived in v2.1
	    else
		fd->eof = fd->empty_container ? 1 : 2;
	    return NULL;
	} else {
	    rd+=s;
	}
	len = le_int4(c2.length);
	crc = crc32(0L, (unsigned char *)&len, 4);
    }
    if ((s = itf8_decode_crc(fd, &c2.ref_seq_id, &crc))   == -1) return NULL; else rd+=s;
    if ((s = itf8_decode_crc(fd, &c2.ref_seq_start, &crc))== -1) return NULL; else rd+=s;
    if ((s = itf8_decode_crc(fd, &c2.ref_seq_span, &crc)) == -1) return NULL; else rd+=s;
    if ((s = itf8_decode_crc(fd, &c2.num_records, &crc))  == -1) return NULL; else rd+=s;

    if (CRAM_MAJOR_VERS(fd->version) == 1) {
	c2.record_counter = 0;
	c2.num_bases = 0;
    } else {
	if (CRAM_MAJOR_VERS(fd->version) >= 3) {
	    if ((s = ltf8_decode_crc(fd, &c2.record_counter, &crc)) == -1)
		return NULL;
	    else
		rd += s;
	} else {
	    int32_t i32;
	    if ((s = itf8_decode_crc(fd, &i32, &crc)) == -1)
		return NULL;
	    else
		rd += s;
	    c2.record_counter = i32;
	}

	if ((s = ltf8_decode_crc(fd, &c2.num_bases, &crc))== -1)
	    return NULL;
	else
	    rd += s;
    }
    if ((s = itf8_decode_crc(fd, &c2.num_blocks, &crc))   == -1) return NULL; else rd+=s;
    if ((s = itf8_decode_crc(fd, &c2.num_landmarks, &crc))== -1) return NULL; else rd+=s;

    if (!(c = calloc(1, sizeof(*c))))
	return NULL;

    *c = c2;

    if (!(c->landmark = malloc(c->num_landmarks * sizeof(int32_t))) &&
	c->num_landmarks) {
	fd->err = errno;
	cram_free_container(c);
	return NULL;
    }  
    for (i = 0; i < c->num_landmarks; i++) {
	if ((s = itf8_decode_crc(fd, &c->landmark[i], &crc)) == -1) {
	    cram_free_container(c);
	    return NULL;
	} else {
	    rd += s;
	}
    }

    if (CRAM_MAJOR_VERS(fd->version) >= 3) {
	if (-1 == int32_decode(fd, (int32_t *)&c->crc32))
	    return NULL;
	else
	    rd+=4;

	if (crc != c->crc32) {
	    fprintf(stderr, "Container header CRC32 failure\n");
	    cram_free_container(c);
	    return NULL;
	}
    }

    c->offset = rd;
    c->slices = NULL;
    c->curr_slice = 0;
    c->max_slice = c->num_landmarks;
    c->slice_rec = 0;
    c->curr_rec = 0;
    c->max_rec = 0;

    if (c->ref_seq_id == -2) {
	c->multi_seq = 1;
	fd->multi_seq = 1;
    }

    fd->empty_container =
	(c->num_records == 0 &&
	 c->ref_seq_id == -1 &&
	 c->ref_seq_start == 0x454f46 /* EOF */) ? 1 : 0;

    return c;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x258, %rsp            # imm = 0x258
movq %rdi, %rbx
xorl %eax, %eax
movl %eax, (%rsp)
movl %eax, 0x30(%rdi)
movl %eax, 0x8848(%rdi)
leaq 0x8(%rsp), %rdi
movl $0x250, %edx            # imm = 0x250
xorl %esi, %esi
callq 0x63b0
movl $0xffffff00, %eax       # imm = 0xFFFFFF00
andl 0xc(%rbx), %eax
leaq 0x8(%rsp), %rsi
cmpl $0x100, %eax            # imm = 0x100
jne 0x59837
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x542b5
cmpl $-0x1, %eax
je 0x59865
movslq %eax, %r12
jmp 0x598ae
movq %rbx, %rdi
callq 0x55adf
movl %eax, %ebp
cmpl $-0x1, %eax
je 0x59882
movslq %ebp, %r12
movl 0x8(%rsp), %eax
leaq 0x4(%rsp), %rsi
movl %eax, (%rsi)
xorl %edi, %edi
movl $0x4, %edx
callq 0x64b0
movl %eax, (%rsp)
jmp 0x598a5
xorl %r14d, %r14d
cmpl $0x1, 0x8858(%rbx)
movl $0x0, %eax
adcl $0x1, %eax
movl %eax, 0x8848(%rbx)
jmp 0x59b1b
movl $0x1, %eax
cmpl $0x200, 0xc(%rbx)       # imm = 0x200
je 0x5989c
xorl %eax, %eax
cmpl $0x1, 0x8858(%rbx)
adcl $0x1, %eax
movl %eax, 0x8848(%rbx)
xorl %r12d, %r12d
cmpl $-0x1, %ebp
je 0x59b18
leaq 0xc(%rsp), %rsi
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x542b5
cmpl $-0x1, %eax
je 0x59b18
movl %eax, %ebp
leaq 0x10(%rsp), %rsi
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x542b5
cmpl $-0x1, %eax
je 0x59b18
movl %eax, %r14d
leaq 0x14(%rsp), %rsi
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x542b5
cmpl $-0x1, %eax
je 0x59b18
movl %eax, %r15d
leaq 0x28(%rsp), %rsi
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x542b5
cmpl $-0x1, %eax
je 0x59b18
movl %ebp, %ecx
addq %rcx, %r12
movl %r14d, %ecx
movl %r15d, %edx
addq %rcx, %rdx
addq %r12, %rdx
movl %eax, %r12d
addq %rdx, %r12
movl 0xc(%rbx), %eax
sarl $0x8, %eax
cmpl $0x1, %eax
jne 0x59946
xorps %xmm0, %xmm0
movups %xmm0, 0x18(%rsp)
jmp 0x599a4
cmpl $0x3, %eax
jl 0x59962
leaq 0x18(%rsp), %rsi
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x55148
movl %eax, %eax
addq %rax, %r12
jmp 0x5998f
leaq 0x4(%rsp), %rsi
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x542b5
cmpl $-0x1, %eax
je 0x59986
movl %eax, %ecx
addq %rcx, %r12
movslq 0x4(%rsp), %rcx
movq %rcx, 0x18(%rsp)
cmpl $-0x1, %eax
je 0x59b18
leaq 0x20(%rsp), %rsi
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x55148
movl %eax, %eax
addq %rax, %r12
leaq 0x2c(%rsp), %rsi
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x542b5
cmpl $-0x1, %eax
je 0x59b18
movl %eax, %ebp
leaq 0x30(%rsp), %rsi
movq %rsp, %rdx
movq %rbx, %rdi
callq 0x542b5
cmpl $-0x1, %eax
je 0x59b18
movl %eax, %r15d
movl $0x1, %edi
movl $0x250, %esi            # imm = 0x250
callq 0x6470
testq %rax, %rax
je 0x59b18
movq %rax, %r14
leaq 0x8(%rsp), %rsi
movl $0x250, %edx            # imm = 0x250
movq %rax, %rdi
callq 0x6570
movslq 0x28(%r14), %rdi
testq %rdi, %rdi
setne %r13b
shlq $0x2, %rdi
callq 0x69d0
movq %rax, 0x30(%r14)
testq %rax, %rax
sete %al
testb %al, %r13b
jne 0x59b06
movl %ebp, %eax
movl %r15d, %ecx
addq %rax, %rcx
addq %rcx, %r12
cmpl $0x0, 0x28(%r14)
jle 0x59a79
xorl %r13d, %r13d
movq %rsp, %r15
xorl %ebp, %ebp
movq 0x30(%r14), %rsi
addq %r13, %rsi
movq %rbx, %rdi
movq %r15, %rdx
callq 0x542b5
cmpl $-0x1, %eax
je 0x59b10
movl %eax, %eax
addq %rax, %r12
incq %rbp
movslq 0x28(%r14), %rax
addq $0x4, %r13
cmpq %rax, %rbp
jl 0x59a49
cmpl $0x300, 0xc(%rbx)       # imm = 0x300
jl 0x59aac
movq %r14, %r15
addq $0x248, %r15            # imm = 0x248
movq %rbx, %rdi
movq %r15, %rsi
callq 0x55adf
cmpl $-0x1, %eax
je 0x59b18
movl (%rsp), %eax
cmpl (%r15), %eax
jne 0x59b30
addq $0x4, %r12
movq %r12, 0x38(%r14)
xorl %eax, %eax
movq %rax, 0x78(%r14)
movl %eax, 0x54(%r14)
movl 0x4(%r14), %ecx
movl 0x28(%r14), %edx
movl %edx, 0x50(%r14)
movl %eax, 0x68(%r14)
movq %rax, 0x58(%r14)
cmpl $-0x2, %ecx
jne 0x59ae5
movl $0x1, %edx
movl %edx, 0x94(%r14)
movl %edx, 0x8850(%rbx)
cmpl $-0x1, %ecx
jne 0x59afe
cmpl $0x0, 0x20(%r14)
jne 0x59afe
xorl %eax, %eax
cmpl $0x454f46, 0x8(%r14)    # imm = 0x454F46
sete %al
movl %eax, 0x8858(%rbx)
jmp 0x59b1b
callq 0x6060
movl (%rax), %eax
movl %eax, 0x30(%rbx)
movq %r14, %rdi
callq 0x593d4
xorl %r14d, %r14d
movq %r14, %rax
addq $0x258, %rsp            # imm = 0x258
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %r14, %rdi
callq 0x791c
jmp 0x59b18