user: What is the c source code of the assembly code below?

```asm
<memcaseequal>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  movq   $0x0,-0x8(%rbp)
  jmp    L84
L89:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x8(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  je     L102
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x8(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jge    L202
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x40,%al
  jle    L94
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5a,%al
  jle    L97
L94:
  mov    $0x0,%eax
  jmp    L30
L97:
  mov    -0x20(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L68
  mov    -0x20(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jle    L47
L68:
  mov    $0x0,%eax
  jmp    L30
L47:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    0x20(%rax),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x8(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    %eax,%edx
  je     L202
  mov    $0x0,%eax
  jmp    L30
L202:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x8(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jle    L134
  mov    -0x20(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x40,%al
  jle    L78
  mov    -0x20(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5a,%al
  jle    L0
L78:
  mov    $0x0,%eax
  jmp    L30
L0:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L55
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jle    L165
L55:
  mov    $0x0,%eax
  jmp    L30
L165:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x20(%rax),%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x8(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    %eax,%edx
  je     L134
  mov    $0x0,%eax
  jmp    L30
L102:
  nop
L134:
  addq   $0x1,-0x8(%rbp)
L84:
  mov    -0x8(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jb     L89
  mov    $0x1,%eax
L30:
  pop    %rbp
  ret
```

assistant: ```c
int memcaseequal(const char *str1, const char *str2, size_t length) {
  size_t i;
  for (i = 0; i < length; i++) {
    if (str1[i] == str2[i]) {
      continue;
    }
    if (str1[i] < str2[i]) {
      if (str1[i] < 'A' || str1[i] > 'Z') {
        return 0;
      }
      if (str2[i] < 'a' || str2[i] > 'z') {
        return 0;
      }
      if (str1[i] + 'a' - 'A' != str2[i]) {
        return 0;
      }
    }
    if (str1[i] > str2[i]) {
      if (str2[i] < 'A' || str2[i] > 'Z') {
        return 0;
      }
      if (str1[i] < 'a' || str1[i] > 'z') {
        return 0;
      }
      if (str1[i] + 'A' - 'a' != str2[i]) {
        return 0;
      }
    }
  }
  return 1;
}
```