// File: /workspace/github_c_makefile_star2_O0/samtools[P]htslib/multipart.c
// Function: multipart_read
static ssize_t multipart_read(hFILE *fpv, void *buffer, size_t nbytes)
{
    hFILE_multipart *fp = (hFILE_multipart *) fpv;
    size_t n;

open_next:
    if (fp->currentfp == NULL) {
        if (fp->current < fp->nparts) {
            const hfile_part *p = &fp->parts[fp->current];
            hts_log_debug("Opening part #%zu of %zu: \"%.120s%s\"",
                fp->current+1, fp->nparts, p->url,
                (strlen(p->url) > 120)? "..." : "");

            fp->currentfp = p->headers?
                  hopen(p->url, "r:",
                        "httphdr:v", p->headers,
                        "auth_token_enabled", "false", NULL)
                : hopen(p->url, "r:", "auth_token_enabled", "false", NULL);

            if (fp->currentfp == NULL) return -1;
        }
        else return 0;  // No more parts, so we're truly at EOF
    }

    n = fp->currentfp->mobile?
          fp->currentfp->backend->read(fp->currentfp, buffer, nbytes)
        : hread(fp->currentfp, buffer, nbytes);

    if (n == 0) {
        // We're at EOF on this part, so set up the next part
        hFILE *prevfp = fp->currentfp;
        free_part(&fp->parts[fp->current]);
        fp->current++;
        fp->currentfp = NULL;
        if (hclose(prevfp) < 0) return -1;
        goto open_next;
    }

    return n;  // Number of bytes read by (or an error from) fp->currentfp
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
cmpq $0x0, 0x58(%rax)
jne 0x2d710
movq -0x28(%rbp), %rax
movq 0x50(%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0x40(%rcx), %rax
jae 0x2d701
movq -0x28(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x50(%rcx), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
movq 0x50(%rax), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rax
movq %rax, -0x50(%rbp)
movq -0x38(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x38(%rbp), %rax
movq (%rax), %rdi
callq 0x41b0
movq -0x58(%rbp), %rcx
movq -0x50(%rbp), %r8
movq -0x48(%rbp), %r9
movq %rax, %rsi
leaq 0xc2940(%rip), %rax     # 0xeff75
leaq 0xc3a21(%rip), %rdx     # 0xf105d
cmpq $0x78, %rsi
cmovaq %rdx, %rax
movl $0x5, %edi
leaq 0xc39d9(%rip), %rsi     # 0xf1029
leaq 0xc39e1(%rip), %rdx     # 0xf1038
movq %rax, (%rsp)
movb $0x0, %al
callq 0x1b030
movq -0x38(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x2d6af
movq -0x38(%rbp), %rax
movq (%rax), %rdi
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rcx
leaq 0xc39de(%rip), %rsi     # 0xf1061
leaq 0xc39da(%rip), %rdx     # 0xf1064
leaq 0xc39dd(%rip), %r8      # 0xf106e
leaq 0xc39e9(%rip), %r9      # 0xf1081
xorl %eax, %eax
movq $0x0, (%rsp)
movb $0x0, %al
callq 0x158b0
movq %rax, -0x60(%rbp)
jmp 0x2d6db
movq -0x38(%rbp), %rax
movq (%rax), %rdi
leaq 0xc39a4(%rip), %rsi     # 0xf1061
leaq 0xc39aa(%rip), %rdx     # 0xf106e
leaq 0xc39b6(%rip), %rcx     # 0xf1081
xorl %eax, %eax
movl %eax, %r8d
movb $0x0, %al
callq 0x158b0
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x58(%rax)
movq -0x28(%rbp), %rax
cmpq $0x0, 0x58(%rax)
jne 0x2d6ff
movq $-0x1, -0x8(%rbp)
jmp 0x2d7df
jmp 0x2d70e
movq $0x0, -0x8(%rbp)
jmp 0x2d7df
jmp 0x2d710
movq -0x28(%rbp), %rax
movq 0x58(%rax), %rax
movb 0x30(%rax), %al
shrb %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
je 0x2d74e
movq -0x28(%rbp), %rax
movq 0x58(%rax), %rax
movq 0x20(%rax), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x58(%rcx), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq *%rax
movq %rax, -0x68(%rbp)
jmp 0x2d767
movq -0x28(%rbp), %rax
movq 0x58(%rax), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x2d8b0
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
jne 0x2d7d7
movq -0x28(%rbp), %rax
movq 0x58(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x28(%rbp), %rax
movq 0x38(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x50(%rax), %rax
shlq $0x4, %rax
addq %rax, %rdi
callq 0x2d510
movq -0x28(%rbp), %rax
movq 0x50(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x50(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x58(%rax)
movq -0x40(%rbp), %rdi
callq 0x14920
cmpl $0x0, %eax
jge 0x2d7d2
movq $-0x1, -0x8(%rbp)
jmp 0x2d7df
jmp 0x2d5ac
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x70, %rsp
popq %rbp
retq
nopl (%rax)