// File: /workspace/github_c_makefile_star2_O0/samtools[P]htslib/hfile_libcurl.c
// Function: libcurl_read
static ssize_t libcurl_read(hFILE *fpv, void *bufferv, size_t nbytes)
{
    hFILE_libcurl *fp = (hFILE_libcurl *) fpv;
    char *buffer = (char *) bufferv;
    off_t to_skip = -1;
    ssize_t got = 0;
    CURLcode err;

    if (fp->delayed_seek >= 0) {
        assert(fp->base.offset == fp->delayed_seek);

        if (fp->preserved
            && fp->last_offset > fp->delayed_seek
            && fp->last_offset - fp->preserved_bytes <= fp->delayed_seek) {
            // Can use buffer contents copied when seeking started, to
            // avoid having to re-read data discarded by hseek().
            // Note fp->last_offset is the offset of the *end* of the
            // preserved buffer.
            size_t n = fp->last_offset - fp->delayed_seek;
            char *start = fp->preserved + (fp->preserved_bytes - n);
            size_t bytes = n <= nbytes ? n : nbytes;
            memcpy(buffer, start, bytes);
            if (bytes < n) { // Part of the preserved buffer still left
                fp->delayed_seek += bytes;
            } else {
                fp->last_offset = fp->delayed_seek = -1;
            }
            return bytes;
        }

        if (fp->last_offset >= 0
            && fp->delayed_seek > fp->last_offset
            && fp->delayed_seek - fp->last_offset < MIN_SEEK_FORWARD) {
            // If not seeking far, just read the data and throw it away.  This
            // is likely to be quicker than opening a new stream
            to_skip = fp->delayed_seek - fp->last_offset;
        } else {
            if (restart_from_position(fp, fp->delayed_seek) < 0) {
                return -1;
            }
        }
        fp->delayed_seek = -1;
        fp->last_offset = -1;
        fp->preserved_bytes = 0;
    }

    do {
        fp->buffer.ptr.rd = buffer;
        fp->buffer.len = nbytes;
        fp->paused = 0;
        if (!fp->finished) {
            err = curl_easy_pause(fp->easy, CURLPAUSE_CONT);
            if (err != CURLE_OK) {
                errno = easy_errno(fp->easy, err);
                return -1;
            }
        }

        while (! fp->paused && ! fp->finished) {
            if (wait_perform(fp) < 0) return -1;
        }

        got = fp->buffer.ptr.rd - buffer;

        if (to_skip >= 0) { // Skipping over a small seek
            if (got <= to_skip) { // Need to skip more data
                to_skip -= got;
            } else {
                got -= to_skip;
                if (got > 0) {  // If enough was skipped, return the rest
                    memmove(buffer, buffer + to_skip, got);
                    to_skip = -1;
                }
            }
        }
    } while (to_skip >= 0 && ! fp->finished);
    fp->buffer.ptr.rd = NULL;
    fp->buffer.len = 0;

    if (fp->finished && fp->final_result != CURLE_OK) {
        errno = easy_errno(fp->easy, fp->final_result);
        return -1;
    }

    return got;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x30(%rbp)
movq $-0x1, -0x38(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x28(%rbp), %rax
cmpq $0x0, 0xd0(%rax)
jl 0xd2786
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0xd0(%rcx), %rax
jne 0xd25a0
jmp 0xd25bf
leaq 0x250ae(%rip), %rdi     # 0xf7655
leaq 0x250cb(%rip), %rsi     # 0xf7679
movl $0x310, %edx            # imm = 0x310
leaq 0x250cf(%rip), %rcx     # 0xf7689
callq 0x42e0
movq -0x28(%rbp), %rax
cmpq $0x0, 0xe0(%rax)
je 0xd26d1
movq -0x28(%rbp), %rax
movq 0xd8(%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0xd0(%rcx), %rax
jle 0xd26d1
movq -0x28(%rbp), %rax
movq 0xd8(%rax), %rax
movq -0x28(%rbp), %rcx
subq 0xe8(%rcx), %rax
movq -0x28(%rbp), %rcx
cmpq 0xd0(%rcx), %rax
ja 0xd26d1
movq -0x28(%rbp), %rax
movq 0xd8(%rax), %rax
movq -0x28(%rbp), %rcx
subq 0xd0(%rcx), %rax
movq %rax, -0x50(%rbp)
movq -0x28(%rbp), %rax
movq 0xe0(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0xe8(%rcx), %rcx
subq -0x50(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x58(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x20(%rbp), %rax
ja 0xd2663
movq -0x50(%rbp), %rax
movq %rax, -0x68(%rbp)
jmp 0xd266b
movq -0x20(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x30(%rbp), %rdi
movq -0x58(%rbp), %rsi
movq -0x60(%rbp), %rdx
callq 0x43b0
movq -0x60(%rbp), %rax
cmpq -0x50(%rbp), %rax
jae 0xd26a6
movq -0x60(%rbp), %rcx
movq -0x28(%rbp), %rax
addq 0xd0(%rax), %rcx
movq %rcx, 0xd0(%rax)
jmp 0xd26c4
movq -0x28(%rbp), %rax
movq $-0x1, 0xd0(%rax)
movq -0x28(%rbp), %rax
movq $-0x1, 0xd8(%rax)
movq -0x60(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2968
movq -0x28(%rbp), %rax
cmpq $0x0, 0xd8(%rax)
jl 0xd2731
movq -0x28(%rbp), %rax
movq 0xd0(%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0xd8(%rcx), %rax
jle 0xd2731
movq -0x28(%rbp), %rax
movq 0xd0(%rax), %rax
movq -0x28(%rbp), %rcx
subq 0xd8(%rcx), %rax
cmpq $0xf4240, %rax          # imm = 0xF4240
jge 0xd2731
movq -0x28(%rbp), %rax
movq 0xd0(%rax), %rax
movq -0x28(%rbp), %rcx
subq 0xd8(%rcx), %rax
movq %rax, -0x38(%rbp)
jmp 0xd2759
movq -0x28(%rbp), %rdi
movq -0x28(%rbp), %rax
movq 0xd0(%rax), %rsi
callq 0xd0790
cmpl $0x0, %eax
jge 0xd2757
movq $-0x1, -0x8(%rbp)
jmp 0xd2968
jmp 0xd2759
movq -0x28(%rbp), %rax
movq $-0x1, 0xd0(%rax)
movq -0x28(%rbp), %rax
movq $-0x1, 0xd8(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0xe8(%rax)
jmp 0xd2788
movq -0x30(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x50(%rax)
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x58(%rax)
movq -0x28(%rbp), %rax
movb 0x64(%rax), %cl
andb $-0x2, %cl
orb $0x0, %cl
movb %cl, 0x64(%rax)
movq -0x28(%rbp), %rax
movb 0x64(%rax), %al
shrb $0x2, %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0xd2808
movq -0x28(%rbp), %rax
movq 0x38(%rax), %rdi
xorl %esi, %esi
callq 0x4970
movl %eax, -0x44(%rbp)
cmpl $0x0, -0x44(%rbp)
je 0xd2806
movq -0x28(%rbp), %rax
movq 0x38(%rax), %rdi
movl -0x44(%rbp), %esi
callq 0xced50
movl %eax, -0x6c(%rbp)
callq 0x4050
movl -0x6c(%rbp), %ecx
movl %ecx, (%rax)
movq $-0x1, -0x8(%rbp)
jmp 0xd2968
jmp 0xd2808
jmp 0xd280a
movq -0x28(%rbp), %rax
movb 0x64(%rax), %al
andb $0x1, %al
movzbl %al, %ecx
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, -0x6d(%rbp)
jne 0xd283a
movq -0x28(%rbp), %rax
movb 0x64(%rax), %al
shrb $0x2, %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x6d(%rbp)
movb -0x6d(%rbp), %al
testb $0x1, %al
jne 0xd2843
jmp 0xd2860
movq -0x28(%rbp), %rdi
callq 0xd0470
cmpl $0x0, %eax
jge 0xd285e
movq $-0x1, -0x8(%rbp)
jmp 0xd2968
jmp 0xd280a
movq -0x28(%rbp), %rax
movq 0x50(%rax), %rax
movq -0x30(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x38(%rbp)
jl 0xd28cc
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
jg 0xd2895
movq -0x40(%rbp), %rcx
movq -0x38(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x38(%rbp)
jmp 0xd28ca
movq -0x38(%rbp), %rcx
movq -0x40(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x40(%rbp)
jle 0xd28c8
movq -0x30(%rbp), %rdi
movq -0x30(%rbp), %rsi
addq -0x38(%rbp), %rsi
movq -0x40(%rbp), %rdx
callq 0x4810
movq $-0x1, -0x38(%rbp)
jmp 0xd28ca
jmp 0xd28cc
jmp 0xd28ce
xorl %eax, %eax
cmpq $0x0, -0x38(%rbp)
movb %al, -0x6e(%rbp)
jl 0xd28f4
movq -0x28(%rbp), %rax
movb 0x64(%rax), %al
shrb $0x2, %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x6e(%rbp)
movb -0x6e(%rbp), %al
testb $0x1, %al
jne 0xd2788
movq -0x28(%rbp), %rax
movq $0x0, 0x50(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x58(%rax)
movq -0x28(%rbp), %rax
movb 0x64(%rax), %al
shrb $0x2, %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
je 0xd2960
movq -0x28(%rbp), %rax
cmpl $0x0, 0x60(%rax)
je 0xd2960
movq -0x28(%rbp), %rax
movq 0x38(%rax), %rdi
movq -0x28(%rbp), %rax
movl 0x60(%rax), %esi
callq 0xced50
movl %eax, -0x74(%rbp)
callq 0x4050
movl -0x74(%rbp), %ecx
movl %ecx, (%rax)
movq $-0x1, -0x8(%rbp)
jmp 0xd2968
movq -0x40(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x80, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)