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

```asm
<todate_>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %rcx,-0x60(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x28(%rbp)
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x34(%rbp),%eax
  mov    %eax,-0x38(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x24(%rbp)
  mov    -0x58(%rbp),%rax
  movsd  D37(%rip),%xmm0
  movsd  %xmm0,(%rax)
  movl   $0xffffffff,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  nop
L156:
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jge    L183
  addl   $0x1,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L156
L183:
  nop
L138:
  cmpl   $0x0,-0x1c(%rbp)
  js     L322
  subl   $0x1,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L322
  cmpl   $0x0,-0x1c(%rbp)
  jns    L138
L322:
  nop
L302:
  mov    -0x20(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jg     L196
  addl   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L302
L196:
  mov    -0x1c(%rbp),%eax
  sub    -0x20(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x8,-0x14(%rbp)
  je     L213
  cmpl   $0x7,-0x14(%rbp)
  jne    L1
  cmpl   $0x1,-0x20(%rbp)
  jne    L1
L213:
  mov    -0x50(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L1
  mov    -0x50(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L1
  lea    -0x38(%rbp),%rsi
  lea    -0x34(%rbp),%rcx
  lea    -0x30(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  mov    %rsi,%r8
  lea    D34(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    -0x60(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  je     L190
  mov    -0x30(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x34(%rbp),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x34(%rbp)
L190:
  mov    -0x38(%rbp),%eax
  add    $0x76c,%eax
  mov    %eax,-0x38(%rbp)
  jmp    L63
L1:
  cmpl   $0xa,-0x14(%rbp)
  jne    L44
  mov    -0x50(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L44
  mov    -0x50(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L44
  lea    -0x30(%rbp),%rsi
  lea    -0x34(%rbp),%rcx
  lea    -0x38(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  mov    %rsi,%r8
  lea    D32(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  jmp    L63
L44:
  cmpl   $0x12,-0x14(%rbp)
  jle    L357
  mov    -0x50(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L357
  mov    -0x50(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L357
  mov    -0x50(%rbp),%rax
  add    $0xa,%rax
  movzbl (%rax),%eax
  cmp    $0x54,%al
  jne    L357
  mov    -0x50(%rbp),%rax
  add    $0xd,%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  jne    L357
  mov    -0x50(%rbp),%rax
  add    $0x10,%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  jne    L357
  lea    -0x2c(%rbp),%r8
  lea    -0x30(%rbp),%rdi
  lea    -0x34(%rbp),%rcx
  lea    -0x38(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  lea    -0x24(%rbp),%rsi
  push   %rsi
  lea    -0x28(%rbp),%rsi
  push   %rsi
  mov    %r8,%r9
  mov    %rdi,%r8
  lea    D26(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  add    $0x10,%rsp
  nop
L63:
  movss  -0x24(%rbp),%xmm0
  comiss D81(%rip),%xmm0
  jae    L65
  mov    -0x28(%rbp),%eax
  cmp    $0x3b,%eax
  jg     L65
  mov    -0x2c(%rbp),%eax
  cmp    $0x17,%eax
  jg     L65
  mov    -0x34(%rbp),%eax
  cmp    $0xc,%eax
  jg     L65
  mov    -0x34(%rbp),%eax
  sub    $0x1,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D59(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x38(%rbp),%edx
  movslq %edx,%rax
  imul   $0x51eb851f,%rax,%rax
  shr    $0x20,%rax
  sar    $0x7,%eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  imul   $0x190,%eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  test   %eax,%eax
  je     L113
  mov    -0x38(%rbp),%eax
  and    $0x3,%eax
  test   %eax,%eax
  jne    L313
  mov    -0x38(%rbp),%edx
  movslq %edx,%rax
  imul   $0x51eb851f,%rax,%rax
  shr    $0x20,%rax
  sar    $0x5,%eax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  imul   $0x64,%eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  test   %eax,%eax
  je     L313
L113:
  addl   $0x1,-0x18(%rbp)
L313:
  mov    -0x30(%rbp),%eax
  cmp    %eax,-0x18(%rbp)
  jl     L329
  mov    -0x38(%rbp),%eax
  lea    0x12c0(%rax),%ecx
  mov    -0x34(%rbp),%eax
  sub    $0xe,%eax
  movslq %eax,%rdx
  imul   $0x2aaaaaab,%rdx,%rdx
  shr    $0x20,%rdx
  sar    %edx
  sar    $0x1f,%eax
  mov    %eax,%esi
  mov    %edx,%eax
  sub    %esi,%eax
  add    %ecx,%eax
  imul   $0x5b5,%eax,%eax
  lea    0x3(%rax),%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  sar    $0x2,%eax
  mov    %eax,%edi
  mov    -0x34(%rbp),%eax
  lea    -0x2(%rax),%ecx
  mov    -0x34(%rbp),%eax
  sub    $0xe,%eax
  movslq %eax,%rdx
  imul   $0x2aaaaaab,%rdx,%rdx
  shr    $0x20,%rdx
  mov    %edx,%esi
  sar    %esi
  sar    $0x1f,%eax
  sub    %esi,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  imul   $0x16f,%eax,%eax
  movslq %eax,%rdx
  imul   $0x2aaaaaab,%rdx,%rdx
  shr    $0x20,%rdx
  sar    %edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  lea    (%rdi,%rax,1),%ecx
  mov    -0x38(%rbp),%eax
  lea    0x1324(%rax),%esi
  mov    -0x34(%rbp),%eax
  sub    $0xe,%eax
  movslq %eax,%rdx
  imul   $0x2aaaaaab,%rdx,%rdx
  shr    $0x20,%rdx
  sar    %edx
  sar    $0x1f,%eax
  mov    %eax,%edi
  mov    %edx,%eax
  sub    %edi,%eax
  add    %esi,%eax
  movslq %eax,%rdx
  imul   $0x51eb851f,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x5,%edx
  sar    $0x1f,%eax
  sub    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  lea    0x3(%rax),%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  sar    $0x2,%eax
  neg    %eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x30(%rbp),%eax
  add    %edx,%eax
  sub    $0x7d4b,%eax
  mov    %eax,-0xc(%rbp)
  subl   $0x249f01,-0xc(%rbp)
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0xc(%rbp),%xmm1
  mov    -0x2c(%rbp),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  mov    -0x28(%rbp),%eax
  pxor   %xmm3,%xmm3
  cvtsi2sd %eax,%xmm3
  movss  -0x24(%rbp),%xmm0
  cvtss2sd %xmm0,%xmm0
  movsd  D0(%rip),%xmm4
  divsd  %xmm4,%xmm0
  addsd  %xmm3,%xmm0
  movsd  D0(%rip),%xmm3
  divsd  %xmm3,%xmm0
  addsd  %xmm2,%xmm0
  movsd  D75(%rip),%xmm2
  divsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x58(%rbp),%rax
  movsd  %xmm0,(%rax)
  jmp    L140
L357:
  nop
  jmp    L140
L65:
  nop
  jmp    L140
L329:
  nop
L140:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L344
  call   <__stack_chk_fail@plt>
L344:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D37
type_guessed: f32[2]
name: extract_symbolic_data
arguments: label: D34
type_guessed: string
name: extract_symbolic_data
arguments: label: D32
type_guessed: string
name: extract_symbolic_data
arguments: label: D26
type_guessed: string
name: extract_symbolic_data
arguments: label: D81
type_guessed: f32
name: extract_symbolic_data
arguments: label: D0
type_guessed: f32[2]
name: extract_symbolic_data
arguments: label: D75
type_guessed: f64

tool: {"D37": [0.0,-1.875]}

tool: D34: %d/%d/%d

tool: D32: %d-%d-%d

tool: D26: %d-%d-%dT%d:%d:%f

tool: D81: 60

tool: {"D0": [0.0,3.21875]}

tool: D75: 24

assistant: ```c
void todate_(slen, sdate, ddate, oldfits) int *slen;
char *sdate;
double *ddate;
int *oldfits;
{
  static int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  int first, last, len;
  int yr, mon, day, hr, min, mday, mjd, csize, tmp;
  float secs;
  yr = mon = day = hr = min = 0;
  secs = 0.0;
  *ddate = -1.0;
  first = last = -1;
  while (last < *slen && sdate[++last] != '\0')
    ;
  while (last >= 0 && sdate[--last] == ' ' && last >= 0)
    ;
  while (first <= last && sdate[++first] == ' ')
    ;
  len = last - first + 1;
  if ((len == 8 || (len == 7 && first == 1)) && sdate[2] == '/' && sdate[5] == '/') {
    sscanf(sdate, "%d/%d/%d", &day, &mon, &yr);
    if (*oldfits) {
      tmp = day;
      day = mon;
      mon = tmp;
    }
    yr += 1900;
  } else if (len == 10 && sdate[4] == '-' && sdate[7] == '-') {
    sscanf(sdate, "%d-%d-%d", &yr, &mon, &day);
  } else if (len >= 19 && sdate[4] == '-' && sdate[7] == '-' && sdate[10] == 'T' && sdate[13] == ':' && sdate[16] == ':') {
    sscanf(sdate, "%d-%d-%dT%d:%d:%f", &yr, &mon, &day, &hr, &min, &secs);
  } else {
    return;
  }
  if (secs >= 60.0 || min >= 60 || hr >= 24 || mon > 12)
    return;
  mday = days[mon - 1];
  if ((yr % 400 == 0) || ((yr % 4 == 0) && (yr % 100 != 0)))
    mday++;
  if (day > mday)
    return;
  mjd = (1461 * (yr + 4800 + (mon - 14) / 12)) / 4 + (367 * (mon - 2 - 12 * ((mon - 14) / 12))) / 12 - (3 * ((yr + 4900 + (mon - 14) / 12) / 100)) / 4 + day - 32075;
  mjd = mjd - 2400001;
  *ddate = mjd + (hr + (min + secs / 60.0) / 60.0) / 24.0;
}
```