user: Translate the below assembly code into C programming language:

```asm
<BGBDT_TagParse_ParseFloat>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L266
  addq   $0x1,-0x28(%rbp)
  movl   $0xffffffff,-0x20(%rbp)
  jmp    L117
L266:
  movl   $0x1,-0x20(%rbp)
L117:
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  jmp    L154
L129:
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x1c(%rbp)
  movl   $0x0,-0x18(%rbp)
  cmpl   $0x5f,-0x1c(%rbp)
  jne    L118
  jmp    L154
L118:
  cmpl   $0x2e,-0x1c(%rbp)
  jne    L51
  subq   $0x1,-0x28(%rbp)
  jmp    L56
L51:
  cmpl   $0x2f,-0x1c(%rbp)
  jle    L87
  cmpl   $0x39,-0x1c(%rbp)
  jg     L87
  mov    -0x1c(%rbp),%eax
  sub    $0x30,%eax
  mov    %eax,-0x18(%rbp)
L87:
  movsd  -0x10(%rbp),%xmm1
  movsd  D19(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x18(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
L154:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L129
L56:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L94
  addq   $0x1,-0x28(%rbp)
  movsd  D47(%rip),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  jmp    L247
L164:
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x1c(%rbp)
  movl   $0x0,-0x18(%rbp)
  cmpl   $0x5f,-0x1c(%rbp)
  jne    L63
  jmp    L247
L63:
  cmpl   $0x2f,-0x1c(%rbp)
  jle    L261
  cmpl   $0x39,-0x1c(%rbp)
  jg     L261
  mov    -0x1c(%rbp),%eax
  sub    $0x30,%eax
  mov    %eax,-0x18(%rbp)
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x18(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  movsd  -0x10(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x8(%rbp),%xmm1
  movsd  D47(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
L247:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L164
L261:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  je     L238
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x45,%al
  jne    L94
L238:
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2b,%al
  jne    L250
  addq   $0x1,-0x28(%rbp)
L250:
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <BGBDT_TagParse_ParseInt@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  jle    L169
  mov    -0x14(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L61
L122:
  movsd  -0x10(%rbp),%xmm1
  movsd  D19(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
L61:
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x1c(%rbp)
  test   %eax,%eax
  jne    L122
  jmp    L94
L169:
  cmpl   $0x0,-0x14(%rbp)
  jns    L94
  mov    -0x14(%rbp),%eax
  neg    %eax
  mov    %eax,-0x1c(%rbp)
  jmp    L13
L163:
  movsd  -0x10(%rbp),%xmm1
  movsd  D47(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
L13:
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x1c(%rbp)
  test   %eax,%eax
  jne    L163
L94:
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x20(%rbp),%xmm0
  mulsd  -0x10(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D19
datatype: byte[8]
name: extract_symbolic_data
arguments: data_label: D47
datatype: f64

tool: {"D19": [0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x40]}

tool: D47: 0.1

assistant: ```c
double BGBDT_TagParse_ParseFloat(char *s) {
  double v, sc;
  int sg, se;
  int i, j, k;
  if (*s == '-') {
    s++;
    sg = -1;
  } else {
    sg = 1;
  }
  v = 0;
  while (*s) {
    i = *s++;
    j = 0;
    if (i == '_')
      continue;
    if (i == '.') {
      s--;
      break;
    }
    if ((i >= '0') && (i <= '9')) {
      j = i - '0';
    }
    v = (v * 10) + j;
  }
  if (*s == '.') {
    s++;
    sc = 0.1;
    while (*s) {
      i = *s++;
      j = 0;
      if (i == '_')
        continue;
      if ((i >= '0') && (i <= '9')) {
        j = i - '0';
      } else {
        break;
      }
      v = v + (j * sc);
      sc = sc * 0.1;
    }
    if ((*s == 'e') || (*s == 'E')) {
      s++;
      if (*s == '+')
        s++;
      se = BGBDT_TagParse_ParseInt(s);
      if (se > 0) {
        i = se;
        while (i--)
          v = v * 10;
      } else if (se < 0) {
        i = -se;
        while (i--)
          v = v * 0.1;
      }
    }
  }
  return (v * sg);
}
```