user: Please show me the C implementation that matches the assembly code listed 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
L40:
  movsbl %bl,%r14d
  mov    %r14d,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  je     L34
  movsbl %r13b,%r15d
  mov    %r15d,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  je     L34
L19:
  cmp    %r13b,%bl
  jne    L84
  test   %bl,%bl
  je     L163
  movzbl 0x1(%r12),%ebx
  movzbl 0x1(%rbp),%r13d
  add    $0x1,%r12
  add    $0x1,%rbp
  jmp    L40
  nopw   0x0(%rax,%rax,1)
L34:
  mov    %r14d,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  jne    L100
  movsbl %r13b,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  je     L178
  jmp    L100
  nopl   0x0(%rax)
L9:
  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     L182
L178:
  cmp    %r13b,%bl
  je     L9
  movsbl %r13b,%edi
  call   <is_digit@plt>
  test   %rax,%rax
  je     L108
  cmp    %r13b,%bl
  jl     L115
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <strcmp_natural_scan_forward@plt>
  neg    %eax
L26:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L182:
  movsbl %r13b,%r15d
  mov    %r15d,%edi
  call   <is_digit@plt>
  test   %rax,%rax
  je     L19
L195:
  mov    $0xffffffff,%eax
  jmp    L26
  nopl   0x0(%rax)
L115:
  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>
L84:
  lea    -0x61(%rbx),%eax
  cmp    $0x19,%al
  ja     L93
  add    $0x20,%r15d
  cmp    %r14d,%r15d
  je     L54
  lea    -0x61(%r13),%edx
  lea    -0x20(%rbx),%eax
  cmp    $0x19,%dl
  cmova  %eax,%ebx
L100:
  cmp    %r13b,%bl
  jl     L195
L108:
  add    $0x8,%rsp
  mov    $0x1,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L163:
  xor    %eax,%eax
  jmp    L26
L93:
  lea    -0x61(%r13),%eax
  cmp    $0x19,%al
  ja     L100
  sub    $0x20,%r13d
  cmp    %r13b,%bl
  jne    L100
  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>
L54:
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <strcmp_natural_tiebroken@plt>
  neg    %eax
  jmp    L26
```

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;
}
```