user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<SARParseLatitudeDMS>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %rdi,-0xa8(%rbp)
  mov    %rsi,-0xb0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x94(%rbp)
  movl   $0x0,-0x90(%rbp)
  movl   $0x50,-0x80(%rbp)
  cmpq   $0x0,-0xb0(%rbp)
  je     L221
  mov    -0xb0(%rbp),%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
L221:
  cmpq   $0x0,-0xa8(%rbp)
  je     L24
  mov    -0xa8(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L104
L24:
  mov    $0xffffffff,%eax
  jmp    L146
L104:
  mov    -0xa8(%rbp),%rax
  mov    %rax,-0x78(%rbp)
  movl   $0x0,-0x98(%rbp)
  jmp    L432
L59:
  mov    -0x78(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  cmp    $0x27,%al
  jne    L157
  movl   $0x1,-0x94(%rbp)
L157:
  mov    -0x78(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  cmp    $0x53,%al
  jne    L471
  movl   $0x1,-0x90(%rbp)
L471:
  addq   $0x1,-0x78(%rbp)
  addl   $0x1,-0x98(%rbp)
L432:
  mov    -0x78(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L394
  mov    -0x78(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L394
  mov    -0x78(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  jne    L59
L394:
  cmpl   $0x0,-0x98(%rbp)
  jle    L251
  mov    -0x80(%rbp),%edx
  mov    -0x98(%rbp),%eax
  cmp    %eax,%edx
  cmovg  %eax,%edx
  mov    -0xa8(%rbp),%rcx
  lea    -0x60(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  jmp    L477
L251:
  movb   $0x0,-0x60(%rbp)
L477:
  mov    -0x80(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x98(%rbp),%eax
  cmp    %eax,%edx
  cmovle %edx,%eax
  cltq
  movb   $0x0,-0x60(%rbp,%rax,1)
  cmpl   $0x0,-0x94(%rbp)
  je     L200
  movl   $0x0,-0x8c(%rbp)
  movl   $0x0,-0x88(%rbp)
  movl   $0x0,-0x84(%rbp)
  lea    -0x60(%rbp),%rax
  mov    %rax,-0x70(%rbp)
  cmpq   $0x0,-0x70(%rbp)
  je     L9
  mov    -0x70(%rbp),%rax
  mov    $0x27,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x68(%rbp)
  cmpq   $0x0,-0x68(%rbp)
  je     L145
  mov    -0x68(%rbp),%rax
  movb   $0x0,(%rax)
  cmpq   $0x0,-0x70(%rbp)
  je     L50
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  jmp    L0
L50:
  mov    $0x0,%eax
L0:
  mov    %eax,-0x8c(%rbp)
  mov    -0x68(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x70(%rbp)
  jmp    L9
L145:
  cmpq   $0x0,-0x70(%rbp)
  je     L387
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  jmp    L397
L387:
  mov    $0x0,%eax
L397:
  mov    %eax,-0x8c(%rbp)
  movq   $0x0,-0x70(%rbp)
L9:
  cmpq   $0x0,-0x70(%rbp)
  je     L232
  mov    -0x70(%rbp),%rax
  mov    $0x22,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x68(%rbp)
  cmpq   $0x0,-0x68(%rbp)
  je     L386
  mov    -0x68(%rbp),%rax
  movb   $0x0,(%rax)
  cmpq   $0x0,-0x70(%rbp)
  je     L28
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  jmp    L169
L28:
  mov    $0x0,%eax
L169:
  mov    %eax,-0x88(%rbp)
  mov    -0x68(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x70(%rbp)
  jmp    L232
L386:
  cmpq   $0x0,-0x70(%rbp)
  je     L388
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  jmp    L395
L388:
  mov    $0x0,%eax
L395:
  mov    %eax,-0x88(%rbp)
  movq   $0x0,-0x70(%rbp)
L232:
  cmpq   $0x0,-0x70(%rbp)
  je     L46
  mov    -0x70(%rbp),%rax
  mov    $0x22,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x68(%rbp)
  cmpq   $0x0,-0x68(%rbp)
  je     L358
  mov    -0x68(%rbp),%rax
  movb   $0x0,(%rax)
  cmpq   $0x0,-0x70(%rbp)
  je     L245
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  jmp    L341
L245:
  mov    $0x0,%eax
L341:
  mov    %eax,-0x84(%rbp)
  mov    -0x68(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x70(%rbp)
  jmp    L46
L358:
  cmpq   $0x0,-0x70(%rbp)
  je     L374
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  jmp    L30
L374:
  mov    $0x0,%eax
L30:
  mov    %eax,-0x84(%rbp)
  movq   $0x0,-0x70(%rbp)
L46:
  cmpq   $0x0,-0xb0(%rbp)
  je     L337
  cmpl   $0x0,-0x90(%rbp)
  je     L164
  pxor   %xmm0,%xmm0
  cvtsi2ssl -0x8c(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm1,%xmm0
  jbe    L164
  mov    -0x8c(%rbp),%eax
  neg    %eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2ssl -0x88(%rbp),%xmm1
  movss  D14(%rip),%xmm2
  divss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2ssl -0x84(%rbp),%xmm1
  movss  D14(%rip),%xmm2
  divss  %xmm2,%xmm1
  movss  D45(%rip),%xmm2
  divss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  mov    -0xb0(%rbp),%rax
  movss  %xmm0,(%rax)
  jmp    L337
L164:
  cmpl   $0x0,-0x8c(%rbp)
  jns    L472
  pxor   %xmm0,%xmm0
  cvtsi2ssl -0x8c(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2ssl -0x88(%rbp),%xmm1
  movss  D14(%rip),%xmm2
  divss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2ssl -0x84(%rbp),%xmm1
  movss  D14(%rip),%xmm2
  divss  %xmm2,%xmm1
  movss  D45(%rip),%xmm2
  divss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  mov    -0xb0(%rbp),%rax
  movss  %xmm0,(%rax)
  jmp    L337
L472:
  pxor   %xmm1,%xmm1
  cvtsi2ssl -0x8c(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2ssl -0x88(%rbp),%xmm0
  movss  D14(%rip),%xmm2
  divss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2ssl -0x84(%rbp),%xmm0
  movss  D14(%rip),%xmm2
  divss  %xmm2,%xmm0
  movss  D45(%rip),%xmm2
  divss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  mov    -0xb0(%rbp),%rax
  movss  %xmm0,(%rax)
  jmp    L337
L200:
  lea    -0x60(%rbp),%rax
  mov    %rax,-0x70(%rbp)
  cmpq   $0x0,-0xb0(%rbp)
  je     L337
  cmpq   $0x0,-0x70(%rbp)
  je     L315
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <atof@plt>
  movd   %xmm0,%eax
  jmp    L322
L315:
  mov    D27(%rip),%eax
L322:
  mov    %eax,-0x7c(%rbp)
  cmpl   $0x0,-0x90(%rbp)
  je     L230
  movss  -0x7c(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm1,%xmm0
  jbe    L230
  movss  -0x7c(%rbp),%xmm0
  movss  D69(%rip),%xmm1
  xorps  %xmm1,%xmm0
  mov    -0xb0(%rbp),%rax
  movss  %xmm0,(%rax)
  jmp    L337
L230:
  mov    -0xb0(%rbp),%rax
  movss  -0x7c(%rbp),%xmm0
  movss  %xmm0,(%rax)
L337:
  mov    $0x0,%eax
L146:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L398
  call   <__stack_chk_fail@plt>
L398:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D14
type_infered: byte[4]
name: retrieve_data
arguments: tag: D45
type_infered: byte[4]
name: retrieve_data
arguments: tag: D27
type_infered: byte[4]
name: retrieve_data
arguments: tag: D69
type_infered: byte[4]

tool: {"D14": [0x00,0x00,0x70,0x42]}

tool: {"D45": [0x00,0x00,0xc8,0x42]}

tool: {"D27": [0x00,0x00,0x00,0x00]}

tool: {"D69": [0x00,0x00,0x00,0x80]}

assistant: ```c
int SARParseLatitudeDMS(const char *string, float *dms) {
  const char *sp;
  int in_len, is_traditional = 0, is_south = 0;
  int lstring_len = 80;
  char *sp2, *sp3;
  char lstring[80];
  if (dms != NULL)
    *dms = 0.0f;
  if ((string != NULL) ? (*string == '\0') : 1)
    return (-1);
  sp = string;
  in_len = 0;
  while ((*sp != '\0') && !(((*sp) == ' ') || ((*sp) == '\t'))) {
    if (toupper(*sp) == '\'')
      is_traditional = 1;
    if (toupper(*sp) == 'S')
      is_south = 1;
    sp++;
    in_len++;
  }
  if (in_len > 0)
    strncpy(lstring, string, (((in_len) < (lstring_len)) ? (in_len) : (lstring_len)));
  else
    *lstring = '\0';
  lstring[(((in_len) < (lstring_len - 1)) ? (in_len) : (lstring_len - 1))] = '\0';
  if (is_traditional) {
    int d = 0, m = 0, s = 0;
    sp2 = lstring;
    if (sp2 != NULL) {
      sp3 = strchr(sp2, '\'');
      if (sp3 != NULL) {
        *sp3 = '\0';
        d = (((sp2) != NULL) ? atoi(sp2) : 0);
        sp2 = sp3 + 1;
      } else {
        d = (((sp2) != NULL) ? atoi(sp2) : 0);
        sp2 = NULL;
      }
    }
    if (sp2 != NULL) {
      sp3 = strchr(sp2, '"');
      if (sp3 != NULL) {
        *sp3 = '\0';
        m = (((sp2) != NULL) ? atoi(sp2) : 0);
        sp2 = sp3 + 1;
      } else {
        m = (((sp2) != NULL) ? atoi(sp2) : 0);
        sp2 = NULL;
      }
    }
    if (sp2 != NULL) {
      sp3 = strchr(sp2, '"');
      if (sp3 != NULL) {
        *sp3 = '\0';
        s = (((sp2) != NULL) ? atoi(sp2) : 0);
        sp2 = sp3 + 1;
      } else {
        s = (((sp2) != NULL) ? atoi(sp2) : 0);
        sp2 = NULL;
      }
    }
    if (dms != NULL) {
      if (is_south && (d > 0.0f))
        *dms = (float)-d - ((float)m / 60.0f) - ((float)s / 60.0f / 100.0f);
      else if (d < 0)
        *dms = (float)d - ((float)m / 60.0f) - ((float)s / 60.0f / 100.0f);
      else
        *dms = (float)d + ((float)m / 60.0f) + ((float)s / 60.0f / 100.0f);
    }
  } else {
    sp2 = lstring;
    if (dms != NULL) {
      float d = (float)(((sp2) != NULL) ? atof(sp2) : 0.0f);
      if (is_south && (d > 0.0f))
        *dms = -d;
      else
        *dms = d;
    }
  }
  return (0);
}
```