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

```asm
<read_float_10E3>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  movq   $0x0,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L109
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L164
L109:
  mov    $0xffffffffffffffff,%rax
  jmp    L105
L164:
  mov    -0x8(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbq %al,%rax
  add    %rdx,%rax
  sub    $0x30,%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L220
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L164
L220:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L41
  mov    -0x8(%rbp),%rax
  imul   $0x3e8,%rax,%rax
  jmp    L105
L41:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  je     L139
  mov    $0xffffffffffffffff,%rax
  jmp    L105
L139:
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L150
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L24
L150:
  mov    $0xffffffffffffffff,%rax
  jmp    L105
L24:
  mov    -0x8(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbq %al,%rax
  add    %rdx,%rax
  sub    $0x30,%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L153
  mov    -0x8(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x2,%rax
  jmp    L105
L153:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L233
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L4
L233:
  mov    $0xffffffffffffffff,%rax
  jmp    L105
L4:
  mov    -0x8(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbq %al,%rax
  add    %rdx,%rax
  sub    $0x30,%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L25
  mov    -0x8(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  jmp    L105
L25:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L0
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L38
L0:
  mov    $0xffffffffffffffff,%rax
  jmp    L105
L38:
  mov    -0x8(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbq %al,%rax
  add    %rdx,%rax
  sub    $0x30,%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L177
  mov    -0x8(%rbp),%rax
  jmp    L105
L177:
  mov    $0xffffffffffffffff,%rax
L105:
  pop    %rbp
  ret
```

assistant: ```c
long read_float_10E3(const char *string) {
  unsigned long result = 0;
  if (*string < '0' || *string > '9')
    return -1;
  do
    result = result * 10 + *string - '0';
  while (*++string >= '0' && *string <= '9');
  if (!*string)
    return result * 1000;
  if (*string != '.')
    return -1;
  ++string;
  if (*string < '0' || *string > '9')
    return -1;
  result = result * 10 + *string - '0';
  ++string;
  if (!*string)
    return result * 100;
  if (*string < '0' || *string > '9')
    return -1;
  result = result * 10 + *string - '0';
  ++string;
  if (!*string)
    return result * 10;
  if (*string < '0' || *string > '9')
    return -1;
  result = result * 10 + *string - '0';
  ++string;
  if (!*string)
    return result;
  return -1;
}
```