user: 请将以下的汇编代码转换成C语言代码：

```asm
<strcmp_natural_uncasted>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%r12
  mov    %rsi,%rbp
  movzbl (%rdi),%ebx
  movzbl (%rsi),%r13d
  jmp    L15
L142:
  mov    %ebx,%eax
  lea    -0x61(%rbx),%edx
  cmp    $0x19,%dl
  ja     L149
  movsbl %r13b,%edx
  add    $0x20,%edx
  movsbl %bl,%ecx
  cmp    %ecx,%edx
  je     L180
  lea    -0x61(%r13),%edx
  sub    $0x20,%eax
  cmp    $0x19,%dl
  cmova  %eax,%ebx
L81:
  cmp    %r13b,%bl
  setge  %al
  movzbl %al,%eax
  lea    -0x1(%rax,%rax,1),%eax
  jmp    L32
L180:
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <strcmp_natural_tiebroken@plt>
  neg    %eax
  jmp    L32
L149:
  lea    -0x61(%r13),%eax
  cmp    $0x19,%al
  ja     L81
  sub    $0x20,%r13d
  cmp    %r13b,%bl
  jne    L81
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <strcmp_natural_tiebroken@plt>
  jmp    L32
L104:
  mov    %r14d,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  jne    L98
  movsbl %r13b,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  jne    L98
L65:
  cmp    %r13b,%bl
  jne    L58
  add    $0x1,%r12
  movzbl (%r12),%ebx
  add    $0x1,%rbp
  movzbl 0x0(%rbp),%r13d
  movsbl %bl,%edi
  call   <is_digit@plt>
  test   %rax,%rax
  jne    L65
  movsbl %r13b,%edi
  call   <is_digit@plt>
  test   %rax,%rax
  jne    L31
L93:
  cmp    %r13b,%bl
  jne    L142
  test   %bl,%bl
  je     L63
  movzbl 0x1(%r12),%ebx
  movzbl 0x1(%rbp),%r13d
  lea    0x1(%rbp),%rbp
  lea    0x1(%r12),%r12
L15:
  movsbl %bl,%r14d
  mov    %r14d,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  je     L104
  movsbl %r13b,%edi
  call   <is_not_nzdigit@plt>
  test   %rax,%rax
  jne    L93
  jmp    L104
L98:
  cmp    %r13b,%bl
  setge  %al
  movzbl %al,%eax
  lea    -0x1(%rax,%rax,1),%eax
  jmp    L32
L58:
  movsbl %r13b,%edi
  call   <is_digit@plt>
  mov    %rax,%rdx
  mov    $0x1,%eax
  test   %rdx,%rdx
  je     L32
  cmp    %r13b,%bl
  jge    L39
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <strcmp_natural_scan_forward@plt>
L32:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L39:
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <strcmp_natural_scan_forward@plt>
  neg    %eax
  jmp    L32
L31:
  mov    $0xffffffff,%eax
  jmp    L32
L63:
  mov    $0x0,%eax
  jmp    L32
```

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