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

```asm
<fatfs_compare_names>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <FileString_GetExtension@plt>
  mov    %eax,-0x28(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <FileString_GetExtension@plt>
  mov    %eax,-0x24(%rbp)
  cmpl   $0xffffffff,-0x28(%rbp)
  jne    L24
  cmpl   $0xffffffff,-0x24(%rbp)
  je     L24
  mov    $0x0,%eax
  jmp    L18
L24:
  cmpl   $0xffffffff,-0x24(%rbp)
  jne    L61
  cmpl   $0xffffffff,-0x28(%rbp)
  je     L61
  mov    $0x0,%eax
  jmp    L18
L61:
  cmpl   $0xffffffff,-0x28(%rbp)
  je     L4
  mov    -0x28(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,%rbx
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    %rax,%rbx
  je     L111
  mov    $0x0,%eax
  jmp    L18
L111:
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x18(%rbp),%rcx
  mov    -0x20(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <FileString_StrCmpNoCase@plt>
  test   %rax,%rax
  je     L120
  mov    $0x0,%eax
  jmp    L18
L120:
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
  jmp    L130
L4:
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x30(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x2c(%rbp)
L130:
  mov    -0x30(%rbp),%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <FileString_TrimLength@plt>
  mov    %eax,-0x30(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <FileString_TrimLength@plt>
  mov    %eax,-0x2c(%rbp)
  mov    -0x30(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  je     L17
  mov    $0x0,%eax
  jmp    L18
L17:
  mov    -0x30(%rbp),%edx
  mov    -0x40(%rbp),%rcx
  mov    -0x38(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <FileString_StrCmpNoCase@plt>
  test   %rax,%rax
  je     L106
  mov    $0x0,%eax
  jmp    L18
L106:
  mov    $0x1,%eax
L18:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int fatfs_compare_names(char *strA, char *strB) {
  char *ext1 = 0;
  char *ext2 = 0;
  int ext1Pos, ext2Pos;
  int file1Len, file2Len;
  ext1Pos = FileString_GetExtension(strA);
  ext2Pos = FileString_GetExtension(strB);
  if ((ext1Pos == -1) && (ext2Pos != -1))
    return 0;
  if ((ext2Pos == -1) && (ext1Pos != -1))
    return 0;
  if (ext1Pos != -1) {
    ext1 = strA + ext1Pos + 1;
    ext2 = strB + ext2Pos + 1;
    if (strlen(ext1) != strlen(ext2))
      return 0;
    if (FileString_StrCmpNoCase(ext1, ext2, (int)strlen(ext1)) != 0)
      return 0;
    file1Len = ext1Pos;
    file2Len = ext2Pos;
  } else {
    file1Len = (int)strlen(strA);
    file2Len = (int)strlen(strB);
  }
  file1Len = FileString_TrimLength(strA, file1Len);
  file2Len = FileString_TrimLength(strB, file2Len);
  if (file1Len != file2Len)
    return 0;
  if (FileString_StrCmpNoCase(strA, strB, file1Len) != 0)
    return 0;
  else
    return 1;
}
```