user: What would the C source look like for the assembly code provided here?

```asm
<isPalindrome>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  je     L222
  cmpl   $0x1,-0x4(%rbp)
  jne    L112
L222:
  mov    $0x1,%eax
  jmp    L97
L112:
  movl   $0x0,-0xc(%rbp)
  mov    -0x4(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x8(%rbp)
  movb   $0x0,-0xe(%rbp)
  movb   $0x0,-0xd(%rbp)
L320:
  mov    -0xc(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0xc(%rbp)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0xe(%rbp)
  cmpb   $0x40,-0xe(%rbp)
  jle    L226
  cmpb   $0x5a,-0xe(%rbp)
  jg     L226
  movzbl -0xe(%rbp),%eax
  add    $0x20,%eax
  mov    %al,-0xe(%rbp)
L226:
  cmpb   $0x40,-0xe(%rbp)
  jle    L305
  cmpb   $0x5a,-0xe(%rbp)
  jle    L344
L305:
  cmpb   $0x60,-0xe(%rbp)
  jle    L263
  cmpb   $0x7a,-0xe(%rbp)
  jle    L344
L263:
  cmpb   $0x2f,-0xe(%rbp)
  jle    L196
  cmpb   $0x39,-0xe(%rbp)
  jle    L344
L196:
  mov    -0x8(%rbp),%eax
  add    $0x1,%eax
  cmp    %eax,-0xc(%rbp)
  jle    L320
L344:
  mov    -0x8(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x8(%rbp)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0xd(%rbp)
  cmpb   $0x40,-0xd(%rbp)
  jle    L4
  cmpb   $0x5a,-0xd(%rbp)
  jg     L4
  movzbl -0xd(%rbp),%eax
  add    $0x20,%eax
  mov    %al,-0xd(%rbp)
L4:
  cmpb   $0x40,-0xd(%rbp)
  jle    L260
  cmpb   $0x5a,-0xd(%rbp)
  jle    L74
L260:
  cmpb   $0x60,-0xd(%rbp)
  jle    L354
  cmpb   $0x7a,-0xd(%rbp)
  jle    L74
L354:
  cmpb   $0x2f,-0xd(%rbp)
  jle    L150
  cmpb   $0x39,-0xd(%rbp)
  jle    L74
L150:
  mov    -0x8(%rbp),%eax
  add    $0x1,%eax
  cmp    %eax,-0xc(%rbp)
  jle    L344
L74:
  mov    -0x8(%rbp),%eax
  add    $0x1,%eax
  cmp    %eax,-0xc(%rbp)
  jg     L185
  cmpb   $0x40,-0xe(%rbp)
  jle    L208
  cmpb   $0x5a,-0xe(%rbp)
  jle    L327
L208:
  cmpb   $0x60,-0xe(%rbp)
  jle    L63
  cmpb   $0x7a,-0xe(%rbp)
  jle    L327
L63:
  cmpb   $0x2f,-0xe(%rbp)
  jle    L320
  cmpb   $0x39,-0xe(%rbp)
  jg     L320
L327:
  cmpb   $0x40,-0xd(%rbp)
  jle    L156
  cmpb   $0x5a,-0xd(%rbp)
  jle    L78
L156:
  cmpb   $0x60,-0xd(%rbp)
  jle    L215
  cmpb   $0x7a,-0xd(%rbp)
  jle    L78
L215:
  cmpb   $0x2f,-0xd(%rbp)
  jle    L320
  cmpb   $0x39,-0xd(%rbp)
  jg     L320
L78:
  movzbl -0xe(%rbp),%eax
  cmp    -0xd(%rbp),%al
  je     L320
  mov    $0x0,%eax
  jmp    L97
L185:
  nop
  mov    $0x1,%eax
L97:
  leave
  ret
```

assistant: ```c
int isPalindrome(char *s) {
  int len = strlen(s);
  if (len == 0 || len == 1)
    return 1;
  int l = 0, r = len - 1;
  char cl = 0, cr = 0;
  while (1) {
    do {
      cl = s[l++];
      if ((cl >= 'A' && cl <= 'Z'))
        cl += 32;
    } while (!((cl >= 'A' && cl <= 'Z') || (cl >= 'a' && cl <= 'z') || (cl >= '0' && cl <= '9')) && (l <= 1 + r));
    do {
      cr = s[r--];
      if ((cr >= 'A' && cr <= 'Z'))
        cr += 32;
    } while (!((cr >= 'A' && cr <= 'Z') || (cr >= 'a' && cr <= 'z') || (cr >= '0' && cr <= '9')) && (l <= 1 + r));
    if (l > 1 + r)
      break;
    if (((cl >= 'A' && cl <= 'Z') || (cl >= 'a' && cl <= 'z') || (cl >= '0' && cl <= '9')) && ((cr >= 'A' && cr <= 'Z') || (cr >= 'a' && cr <= 'z') || (cr >= '0' && cr <= '9')) && cl != cr)
      return 0;
  }
  return 1;
}
```