// File: andrakis[P]alisp/contrib/linenoise-ng/src/ConvertUTF.cpp
// Function: linenoise_ng::isLegalUTF8(unsigned char const*, int)
static Boolean isLegalUTF8(const UTF8 *source, int length) {
    UTF8 a;
    const UTF8 *srcptr = source+length;
    switch (length) {
    default: return false;
        /* Everything else falls through when "true"... */
    case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
    case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
    case 2: if ((a = (*--srcptr)) > 0xBF) return false;

        switch (*source) {
            /* no fall-through in this inner switch */
            case 0xE0: if (a < 0xA0) return false; break;
            case 0xED: if (a > 0x9F) return false; break;
            case 0xF0: if (a < 0x90) return false; break;
            case 0xF4: if (a > 0x8F) return false; break;
            default:   if (a < 0x80) return false;
        }

    case 1: if (*source >= 0x80 && *source < 0xC2) return false;
    }
    if (*source > 0xF4) return false;
    return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movq -0x10(%rbp), %rax
movslq -0x14(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x20(%rbp)
movl -0x14(%rbp), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x28(%rbp)
subl $0x3, %eax
ja 0x1c87e
movq -0x28(%rbp), %rax
leaq 0x1ff7b(%rip), %rcx     # 0x3c7f0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $-0x1, %rcx
movq %rcx, -0x20(%rbp)
movb -0x1(%rax), %al
movb %al, -0x15(%rbp)
movzbl %al, %eax
cmpl $0x80, %eax
jl 0x1c8b1
movzbl -0x15(%rbp), %eax
cmpl $0xbf, %eax
jle 0x1c8ba
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
jmp 0x1c8bc
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $-0x1, %rcx
movq %rcx, -0x20(%rbp)
movb -0x1(%rax), %al
movb %al, -0x15(%rbp)
movzbl %al, %eax
cmpl $0x80, %eax
jl 0x1c8e6
movzbl -0x15(%rbp), %eax
cmpl $0xbf, %eax
jle 0x1c8ef
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
jmp 0x1c8f1
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $-0x1, %rcx
movq %rcx, -0x20(%rbp)
movb -0x1(%rax), %al
movb %al, -0x15(%rbp)
movzbl %al, %eax
cmpl $0xbf, %eax
jle 0x1c919
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
movq -0x10(%rbp), %rax
movzbl (%rax), %eax
addl $0xffffff20, %eax       # imm = 0xFFFFFF20
movl %eax, %ecx
movq %rcx, -0x30(%rbp)
subl $0x14, %eax
ja 0x1c993
movq -0x30(%rbp), %rax
leaq 0x1fec5(%rip), %rcx     # 0x3c800
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movzbl -0x15(%rbp), %eax
cmpl $0xa0, %eax
jge 0x1c958
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
jmp 0x1c9a6
movzbl -0x15(%rbp), %eax
cmpl $0x9f, %eax
jle 0x1c96b
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
jmp 0x1c9a6
movzbl -0x15(%rbp), %eax
cmpl $0x90, %eax
jge 0x1c97e
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
jmp 0x1c9a6
movzbl -0x15(%rbp), %eax
cmpl $0x8f, %eax
jle 0x1c991
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
jmp 0x1c9a6
movzbl -0x15(%rbp), %eax
cmpl $0x80, %eax
jge 0x1c9a4
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
jmp 0x1c9a6
jmp 0x1c9a8
movq -0x10(%rbp), %rax
movzbl (%rax), %eax
cmpl $0x80, %eax
jl 0x1c9ca
movq -0x10(%rbp), %rax
movzbl (%rax), %eax
cmpl $0xc2, %eax
jge 0x1c9ca
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
jmp 0x1c9cc
movq -0x10(%rbp), %rax
movzbl (%rax), %eax
cmpl $0xf4, %eax
jle 0x1c9e0
movb $0x0, -0x1(%rbp)
jmp 0x1c9e4
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
popq %rbp
retq
nopl (%rax)