user: What is the c source code of the assembly code below:

```asm
<degreeToDMS>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  movsd  %xmm0,-0x18(%rbp)
  mov    %edi,-0x1c(%rbp)
  mov    %rsi,-0x28(%rbp)
  mov    %rdx,-0x30(%rbp)
  mov    %rcx,-0x38(%rbp)
  mov    %r8,-0x40(%rbp)
  movsd  D45(%rip),%xmm0
  comisd -0x18(%rbp),%xmm0
  ja     L57
  movsd  -0x18(%rbp),%xmm0
  comisd D15(%rip),%xmm0
  jbe    L7
L57:
  mov    $0xffffffff,%eax
  jmp    L65
L7:
  pxor   %xmm0,%xmm0
  comisd -0x18(%rbp),%xmm0
  jbe    L58
  mov    -0x28(%rbp),%rax
  movl   $0x1,(%rax)
  movsd  -0x18(%rbp),%xmm0
  movq   D34(%rip),%xmm1
  andpd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  jmp    L15
L58:
  mov    -0x28(%rbp),%rax
  movl   $0x0,(%rax)
L15:
  mov    -0x18(%rbp),%rax
  movq   %rax,%xmm0
  call   <floor@plt>
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x30(%rbp),%rax
  mov    (%rax),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movsd  -0x18(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D38(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movq   %rax,%xmm0
  call   <floor@plt>
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movsd  -0x8(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D38(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x40(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x1c(%rbp),%edx
  mov    %edx,%edi
  movq   %rax,%xmm0
  call   <roundValue@plt>
  movq   %xmm0,%rax
  mov    -0x40(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x40(%rbp),%rax
  movsd  (%rax),%xmm0
  comisd D38(%rip),%xmm0
  jb     L3
  mov    -0x40(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  D38(%rip),%xmm1
  subsd  %xmm1,%xmm0
  mov    -0x40(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,(%rax)
L3:
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x3b,%eax
  jle    L29
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  lea    -0x3c(%rax),%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x30(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
L29:
  mov    $0x0,%eax
L65:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D45
datatype: byte[8]
name: unpack_data
arguments: data_tag: D15
datatype: f64[2]
name: unpack_data
arguments: data_tag: D34
datatype: qword
name: unpack_data
arguments: data_tag: D38
datatype: f64

tool: {"D45": [0x00,0x00,0x00,0x00,0x00,0x80,0x76,0xc0]}

tool: {"D15": [360.0,null]}

tool: D34: 9223372036854775807

tool: D38: 60

assistant: ```c
int degreeToDMS(double deg, int prec, int *neg, int *d, int *m, double *s) {
  double min;
  if (deg < -360.0 || deg > 360.0)
    return (-1);
  if (deg < 0) {
    *neg = 1;
    deg = fabs(deg);
  } else
    *neg = 0;
  *d = (int)floor(deg);
  min = (deg - (double)(*d)) * 60.0;
  *m = (int)floor(min);
  *s = (min - (double)(*m)) * 60.0;
  *s = roundValue(*s, prec);
  if (*s >= 60.) {
    *s -= 60.;
    *m += 1;
  }
  if (*m >= 60) {
    *m -= 60;
    *d += 1;
  }
  return 0;
}
```