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

```asm
<strnatcmp0>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  test   %rdi,%rdi
  setne  %al
  mov    %rdi,0x8(%rsp)
  xor    %edi,%edi
  test   %rsi,%rsi
  setne  %dil
  mov    %rsi,0x10(%rsp)
  xor    %ebx,%ebx
  and    %eax,%edi
  mov    %edx,0x1c(%rsp)
  call   <assert@plt>
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L132:
  movslq %eax,%r14
  mov    0x8(%rsp),%rax
  movslq %ebx,%rbx
  movzbl (%rax,%r14,1),%ebp
  mov    0x10(%rsp),%rax
  movzbl (%rax,%rbx,1),%r12d
  jmp    L121
  nopl   0x0(%rax)
L143:
  mov    0x8(%rsp),%rax
  movzbl (%rax,%r14,1),%ebp
L121:
  movsbl %bpl,%r13d
  mov    %r14d,%r15d
  add    $0x1,%r14
  mov    %r13d,%edi
  call   <nat_isspace@plt>
  test   %rax,%rax
  jne    L143
  jmp    L77
  nopl   0x0(%rax)
L38:
  mov    0x10(%rsp),%rax
  movzbl (%rax,%rbx,1),%r12d
L77:
  movsbl %r12b,%r14d
  mov    %ebx,0x18(%rsp)
  add    $0x1,%rbx
  mov    %r14d,%edi
  call   <nat_isspace@plt>
  test   %rax,%rax
  jne    L38
  mov    %r13d,%edi
  call   <nat_isdigit@plt>
  test   %rax,%rax
  jne    L56
L83:
  mov    %ebp,%eax
  or     %r12b,%al
  je     L47
L18:
  mov    0x1c(%rsp),%eax
  test   %eax,%eax
  jne    L90
  cmp    %r12b,%bpl
  jl     L149
L125:
  jg     L59
  mov    0x18(%rsp),%ebx
  lea    0x1(%r15),%eax
  add    $0x1,%ebx
  jmp    L132
  nopw   0x0(%rax,%rax,1)
L56:
  mov    %r14d,%edi
  call   <nat_isdigit@plt>
  test   %rax,%rax
  je     L83
  movslq 0x18(%rsp),%rsi
  movslq %r15d,%rdi
  add    0x10(%rsp),%rsi
  add    0x8(%rsp),%rdi
  cmp    $0x30,%bpl
  je     L151
  cmp    $0x30,%r12b
  je     L151
  call   <compare_right@plt>
  test   %eax,%eax
  je     L83
L16:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L90:
  mov    %r13d,%edi
  call   <nat_toupper@plt>
  mov    %r14d,%edi
  mov    %eax,%ebp
  call   <nat_toupper@plt>
  mov    %eax,%r12d
  cmp    %r12b,%bpl
  jge    L125
L149:
  add    $0x28,%rsp
  mov    $0xffffffff,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L151:
  call   <compare_left@plt>
  test   %eax,%eax
  jne    L16
  mov    %ebp,%eax
  or     %r12b,%al
  jne    L18
L47:
  add    $0x28,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L59:
  add    $0x28,%rsp
  mov    $0x1,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int strnatcmp0(char const *a, char const *b, int fold_case) {
  int ai, bi;
  char ca, cb;
  int fractional, result;
  assert(a && b);
  ai = bi = 0;
  while (1) {
    ca = a[ai];
    cb = b[bi];
    while (nat_isspace(ca))
      ca = a[++ai];
    while (nat_isspace(cb))
      cb = b[++bi];
    if (nat_isdigit(ca) && nat_isdigit(cb)) {
      fractional = (ca == '0' || cb == '0');
      if (fractional) {
        if ((result = compare_left(a + ai, b + bi)) != 0)
          return result;
      } else {
        if ((result = compare_right(a + ai, b + bi)) != 0)
          return result;
      }
    }
    if (!ca && !cb) {
      return 0;
    }
    if (fold_case) {
      ca = nat_toupper(ca);
      cb = nat_toupper(cb);
    }
    if (ca < cb)
      return -1;
    else if (ca > cb)
      return +1;
    ++ai;
    ++bi;
  }
}
```