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

```asm
<loc_ntoa>:
  endbr64
  push   %r15
  push   %r14
  mov    %rsi,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    (%rdi),%eax
  test   %eax,%eax
  jne    L13
  xor    %r15d,%r15d
  lea    0x10(%rdi),%rbx
  movslq 0x4(%rdi),%rbp
  movslq 0x8(%rdi),%r13
  movslq 0xc(%rdi),%r12
  mov    %rbx,%rsi
  mov    %r15d,%edi
  call   <GETLONG@plt>
  lea    -0x80000000(%r15),%ecx
  mov    %rbx,%rsi
  mov    %r15d,%edi
  mov    %ecx,0xc(%rsp)
  call   <GETLONG@plt>
  mov    %rbx,%rsi
  mov    %r15d,%edi
  call   <GETLONG@plt>
  mov    0xc(%rsp),%edx
  mov    $0x989680,%esi
  mov    %rdx,%rcx
  imul   $0x10624dd3,%rdx,%rdx
  mov    %rdx,%rax
  shr    $0x26,%rdx
  shr    $0x26,%rax
  imul   $0x3e8,%eax,%eax
  sub    %eax,%ecx
  mov    %edx,%eax
  mov    %ecx,0x1c(%rsp)
  mov    $0x88888889,%ecx
  imul   %rcx,%rax
  mov    %rax,%rbx
  shr    $0x25,%rbx
  mov    %ebx,%r15d
  imul   $0x3c,%ebx,%edi
  mov    %rbx,%rax
  imul   %rcx,%r15
  sub    %edi,%edx
  mov    %esi,%edi
  mov    %r15,%rbx
  mov    %edx,0x18(%rsp)
  sar    $0x1f,%edi
  shr    $0x25,%rbx
  imul   $0x3c,%ebx,%edx
  mov    %rbx,%r15
  lea    D12(%rip),%rbx
  sub    %edx,%eax
  mov    %eax,0x14(%rsp)
  movslq %esi,%rax
  imul   $0x51eb851f,%rax,%rax
  sar    $0x25,%rax
  mov    %eax,%edx
  sub    %edi,%eax
  sub    %edi,%edx
  mov    %rbp,%rdi
  imul   $0x64,%edx,%r10d
  sub    %r10d,%esi
  mov    %esi,0x10(%rsp)
  imul   $0xffffffff,%eax,%esi
  mov    %esi,0xc(%rsp)
  call   <precsize_ntoa@plt>
  mov    %eax,%edi
  call   <strdup@plt>
  mov    %r13,%rdi
  test   %rax,%rax
  mov    %rax,%rbp
  cmove  %rbx,%rbp
  call   <precsize_ntoa@plt>
  mov    %eax,%edi
  call   <strdup@plt>
  mov    %r12,%rdi
  test   %rax,%rax
  mov    %rax,%r13
  cmove  %rbx,%r13
  call   <precsize_ntoa@plt>
  mov    %eax,%edi
  call   <strdup@plt>
  mov    %r14,%rdi
  test   %rax,%rax
  mov    %rax,%r12
  cmove  %rbx,%r12
  sub    $0x8,%rsp
  xor    %eax,%eax
  push   %r12
  push   %r13
  push   %rbp
  mov    0x30(%rsp),%edx
  push   %rdx
  mov    0x34(%rsp),%esi
  mov    %r15d,%edx
  push   %rsi
  lea    D16(%rip),%rsi
  push   $0x45
  mov    0x54(%rsp),%r9d
  push   %r9
  mov    0x58(%rsp),%r8d
  push   %r8
  mov    0x5c(%rsp),%ecx
  push   %rcx
  push   %r15
  push   $0x4e
  call   <sprintf@plt>
  add    $0x60,%rsp
  cmp    %rbx,%rbp
  je     L16
  mov    %rbp,%rdi
  call   <free@plt>
L16:
  cmp    %rbx,%r13
  je     L38
  mov    %r13,%rdi
  call   <free@plt>
L38:
  cmp    %rbx,%r12
  je     L5
  mov    %r12,%rdi
  call   <free@plt>
L5:
  add    $0x28,%rsp
  mov    %r14,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L13:
  movdqa D13(%rip),%xmm0
  movups %xmm0,(%rsi)
  movdqa D14(%rip),%xmm0
  movups %xmm0,0x10(%rsi)
  jmp    L5
```

tool_calls: name: disassemble_data
arguments: label: D12
data_type: string
name: disassemble_data
arguments: label: D16
data_type: string
name: disassemble_data
arguments: label: D13
data_type: byte[16]
name: disassemble_data
arguments: label: D14
data_type: byte[16]

tool: D12: ?

tool: D16: %d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %d.%.2dm %sm %sm %sm

tool: {"D13": [0x3b,0x20,0x65,0x72,0x72,0x6f,0x72,0x3a,0x20,0x75,0x6e,0x6b,0x6e,0x6f,0x77,0x6e]}

tool: {"D14": [0x20,0x4c,0x4f,0x43,0x20,0x52,0x52,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x00]}

assistant: ```c
const char *loc_ntoa(const u_char *binary, char *ascii) {
  static char *error = "?";
  const u_char *cp = binary;
  int latdeg, latmin, latsec, latsecfrac;
  int longdeg, longmin, longsec, longsecfrac;
  char northsouth, eastwest;
  int altmeters, altfrac, altsign;
  const u_int32_t referencealt = 100000 * 100;
  int32_t latval, longval, altval;
  u_int32_t templ;
  u_int8_t sizeval, hpval, vpval, versionval;
  char *sizestr, *hpstr, *vpstr;
  versionval = *cp++;
  if (versionval) {
    (void)sprintf(ascii, "; error: unknown LOC RR version");
    return (ascii);
  }
  sizeval = *cp++;
  hpval = *cp++;
  vpval = *cp++;
  GETLONG(templ, cp);
  latval = (templ - ((u_int32_t)1 << 31));
  GETLONG(templ, cp);
  longval = (templ - ((u_int32_t)1 << 31));
  GETLONG(templ, cp);
  if (templ < referencealt) {
    altval = referencealt - templ;
    altsign = -1;
  } else {
    altval = templ - referencealt;
    altsign = 1;
  }
  if (latval < 0) {
    northsouth = 'S';
    latval = -latval;
  } else
    northsouth = 'N';
  latsecfrac = latval % 1000;
  latval = latval / 1000;
  latsec = latval % 60;
  latval = latval / 60;
  latmin = latval % 60;
  latval = latval / 60;
  latdeg = latval;
  if (longval < 0) {
    eastwest = 'W';
    longval = -longval;
  } else
    eastwest = 'E';
  longsecfrac = longval % 1000;
  longval = longval / 1000;
  longsec = longval % 60;
  longval = longval / 60;
  longmin = longval % 60;
  longval = longval / 60;
  longdeg = longval;
  altfrac = altval % 100;
  altmeters = (altval / 100) * altsign;
  if ((sizestr = strdup(precsize_ntoa(sizeval))) == NULL)
    sizestr = error;
  if ((hpstr = strdup(precsize_ntoa(hpval))) == NULL)
    hpstr = error;
  if ((vpstr = strdup(precsize_ntoa(vpval))) == NULL)
    vpstr = error;
  sprintf(ascii, "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %d.%.2dm %sm %sm %sm", latdeg, latmin, latsec, latsecfrac, northsouth, longdeg, longmin, longsec, longsecfrac, eastwest, altmeters, altfrac, sizestr, hpstr, vpstr);
  if (sizestr != error)
    free(sizestr);
  if (hpstr != error)
    free(hpstr);
  if (vpstr != error)
    free(vpstr);
  return (ascii);
}
```