user: Demonstrate the C code that generates the assembly output below:

```asm
<validate_line>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x250,%rsp
  mov    %rdi,-0x248(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x248(%rbp),%rax
  lea    D8(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L4
  mov    -0x248(%rbp),%rax
  lea    D95(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <print_error@plt>
  jmp    L70
L4:
  mov    -0x248(%rbp),%rdx
  lea    -0x210(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  movb   $0x0,-0x10(%rbp)
  lea    -0x210(%rbp),%rax
  mov    $0x1,%edx
  lea    D20(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L52
  mov    -0x248(%rbp),%rax
  lea    D52(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <print_error@plt>
  jmp    L70
L52:
  lea    -0x210(%rbp),%rax
  lea    D82(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strtok@plt>
  lea    -0x210(%rbp),%rax
  lea    D25(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strtok@plt>
  mov    %rax,-0x230(%rbp)
  lea    D25(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %rax,-0x228(%rbp)
  mov    -0x228(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x234(%rbp)
  cmpl   $0x2,-0x234(%rbp)
  jg     L125
  cmpl   $0x0,-0x234(%rbp)
  jg     L129
L125:
  mov    -0x248(%rbp),%rax
  lea    D67(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <print_error@plt>
  jmp    L70
L129:
  lea    D25(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %rax,-0x220(%rbp)
  cmpq   $0x0,-0x220(%rbp)
  jne    L17
  mov    -0x248(%rbp),%rax
  lea    D42(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <print_error@plt>
  jmp    L70
L17:
  mov    -0x220(%rbp),%rax
  mov    %rax,%rdi
  call   <atof@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x218(%rbp)
  pxor   %xmm0,%xmm0
  comisd -0x218(%rbp),%xmm0
  jae    L76
  mov    -0x218(%rbp),%rax
  movq   %rax,%xmm0
  call   <isnormal@plt>
  test   %eax,%eax
  jne    L27
L76:
  mov    -0x248(%rbp),%rax
  lea    D12(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <print_error@plt>
  jmp    L70
L27:
  mov    -0x218(%rbp),%rdx
  mov    -0x234(%rbp),%eax
  movq   %rdx,%xmm0
  mov    %eax,%edi
  call   <add_float@plt>
L70:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L31
  call   <__stack_chk_fail@plt>
L31:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D8
type: string
name: retrieve_data
arguments: tag: D95
type: string
name: retrieve_data
arguments: tag: D20
type: string
name: retrieve_data
arguments: tag: D52
type: string
name: retrieve_data
arguments: tag: D82
type: string
name: retrieve_data
arguments: tag: D25
type: string
name: retrieve_data
arguments: tag: D67
type: string
name: retrieve_data
arguments: tag: D42
type: string
name: retrieve_data
arguments: tag: D12
type: string

tool: D8: 


tool: D95: empty

tool: D20: #

tool: D52: comment

tool: D82: '#

tool: D25: ;

tool: D67: falseLOC

tool: D42: noFloat

tool: D12: falseValue

assistant: ```c
void validate_line(char *line) {
  if (strcmp(line, "\n") == 0) {
    print_error(line, "empty");
    return;
  }
  char lineTMP[512];
  strcpy(lineTMP, line);
  lineTMP[512] = '\0';
  if (strncmp(lineTMP, "#", 1) == 0) {
    print_error(line, "comment");
    return;
  }
  strtok(lineTMP, "'#");
  char *ptr = strtok(lineTMP, ";");
  char *ptrClass = strtok(NULL, ";");
  int loc = atoi(ptrClass);
  if (loc > 2 || loc < 1) {
    print_error(line, "falseLOC");
    return;
  }
  char *ptrFloat = strtok(NULL, ";");
  if (ptrFloat == NULL) {
    print_error(line, "noFloat");
    return;
  }
  double number = atof(ptrFloat);
  if (number <= 0.0 || !isnormal(number)) {
    print_error(line, "falseValue");
    return;
  }
  add_float(loc, number);
}
```