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

```asm
<strcmp_natural_uncasted>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x8,%rsp
  movzbl (%rdi),%ebx
  movzbl (%rsi),%r13d
L22:
  movsbl %bl,%r14d
  mov    %r14d,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  je     L169
  movsbl %r13b,%r15d
  mov    %r15d,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  je     L169
L116:
  cmp    %r13b,%bl
  jne    L164
  test   %bl,%bl
  je     L56
  movzbl 0x1(%r12),%ebx
  movzbl 0x1(%rbp),%r13d
  add    $0x1,%r12
  add    $0x1,%rbp
  jmp    L22
  nopw   0x0(%rax,%rax,1)
L169:
  mov    %r14d,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  jne    L89
  movsbl %r13b,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  je     L94
  jmp    L89
  nopl   0x0(%rax)
L44:
  movsbl 0x1(%r12),%r14d
  add    $0x1,%r12
  add    $0x1,%rbp
  movzbl 0x0(%rbp),%r13d
  mov    %r14d,%edi
  mov    %r14d,%ebx
  call   <is_digit@plt>
  test   %rax,%rax
  je     L90
L94:
  cmp    %r13b,%bl
  je     L44
  movsbl %r13b,%edi
  call   <is_digit@plt>
  test   %rax,%rax
  je     L150
  cmp    %r13b,%bl
  jl     L74
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <strcmp_natural_scan_forward@plt>
  neg    %eax
L141:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L90:
  movsbl %r13b,%r15d
  mov    %r15d,%edi
  call   <is_digit@plt>
  test   %rax,%rax
  je     L116
L10:
  mov    $0xffffffff,%eax
  jmp    L141
  nopl   0x0(%rax)
L74:
  add    $0x8,%rsp
  mov    %rbp,%rsi
  mov    %r12,%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    10b0 <strcmp_natural_scan_forward@plt>
L164:
  lea    -0x61(%rbx),%eax
  cmp    $0x19,%al
  ja     L155
  add    $0x20,%r15d
  cmp    %r14d,%r15d
  je     L132
  lea    -0x61(%r13),%edx
  lea    -0x20(%rbx),%eax
  cmp    $0x19,%dl
  cmova  %eax,%ebx
L89:
  cmp    %r13b,%bl
  jl     L10
L150:
  add    $0x8,%rsp
  mov    $0x1,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L56:
  xor    %eax,%eax
  jmp    L141
L155:
  lea    -0x61(%r13),%eax
  cmp    $0x19,%al
  ja     L89
  sub    $0x20,%r13d
  cmp    %r13b,%bl
  jne    L89
  add    $0x8,%rsp
  mov    %rbp,%rsi
  mov    %r12,%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1080 <strcmp_natural_tiebroken@plt>
L132:
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <strcmp_natural_tiebroken@plt>
  neg    %eax
  jmp    L141
```

assistant: ```c
int strcmp_natural_uncasted(const char *s1, const char *s2) {
  char c1 = *s1;
  char c2 = *s2;
  while (is_not_nzdigit(c1) && is_not_nzdigit(c2)) {
  strcmp_natural_uncasted_state_0:
    if (c1 != c2) {
      if ((c1 >= 'a') && (c1 <= 'z')) {
        if (c2 + 32 == c1) {
          return -strcmp_natural_tiebroken(s2, s1);
        } else if ((c2 < 'a') || (c2 > 'z')) {
          c1 -= 32;
        }
      } else if ((c2 >= 'a') && (c2 <= 'z')) {
        c2 -= 32;
        if (c1 == c2) {
          return strcmp_natural_tiebroken(s1, s2);
        }
      }
      return (c1 < c2) ? -1 : 1;
    } else if (!c1) {
      return 0;
    }
    c1 = *(++s1);
    c2 = *(++s2);
  }
  if (is_not_nzdigit(c1) || is_not_nzdigit(c2)) {
    return (c1 < c2) ? -1 : 1;
  }
  do {
    if (c1 != c2) {
      if (is_digit(c2)) {
        if (c1 < c2) {
          return strcmp_natural_scan_forward(s1, s2);
        } else {
          return -strcmp_natural_scan_forward(s2, s1);
        }
      }
      return 1;
    }
    c1 = *(++s1);
    c2 = *(++s2);
  } while (is_digit(c1));
  if (is_digit(c2)) {
    return -1;
  }
  goto strcmp_natural_uncasted_state_0;
}
```