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

```asm
<parse_word>:
  endbr64
  push   %rbp
  lea    D109(%rip),%rsi
  mov    %rdi,%rbp
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L88
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L203
  add    $0x20,%rsp
  xor    %eax,%eax
  pop    %rbp
  jmp    1140 <duplicate@plt>
  nopl   (%rax)
L88:
  lea    D62(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L173
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L203
  add    $0x20,%rsp
  xor    %eax,%eax
  pop    %rbp
  jmp    1170 <clear@plt>
  nopl   0x0(%rax)
L173:
  lea    D29(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L133
L91:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L203
  add    $0x20,%rsp
  xor    %edi,%edi
  pop    %rbp
  jmp    1160 <exit@plt>
  nopl   0x0(%rax)
L133:
  lea    D92(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L91
  lea    D105(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L65
  call   <POP@plt>
  pxor   %xmm1,%xmm1
  ucomisd %xmm0,%xmm1
  ja     L69
  sqrtsd %xmm0,%xmm0
L165:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L203
L52:
  add    $0x20,%rsp
  pop    %rbp
  jmp    1120 <PUSH@plt>
  nopl   0x0(%rax)
L65:
  lea    D83(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L217
  call   <POP@plt>
  xor    %eax,%eax
  movsd  %xmm0,0x8(%rsp)
  call   <POP@plt>
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L203
  addsd  0x8(%rsp),%xmm0
  add    $0x20,%rsp
  pop    %rbp
  jmp    1120 <PUSH@plt>
L203:
  call   <__stack_chk_fail@plt>
  nopl   0x0(%rax,%rax,1)
L217:
  lea    D37(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L37
  call   <POP@plt>
  xor    %eax,%eax
  movsd  %xmm0,0x10(%rsp)
  call   <POP@plt>
  subsd  0x10(%rsp),%xmm0
  call   <PUSH@plt>
L139:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L203
  add    $0x20,%rsp
  pop    %rbp
  ret
L37:
  lea    D8(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L158
  call   <POP@plt>
  xor    %eax,%eax
  movsd  %xmm0,0x8(%rsp)
  call   <POP@plt>
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L203
  mulsd  0x8(%rsp),%xmm0
  jmp    L52
L158:
  lea    D31(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L110
  call   <POP@plt>
  xor    %eax,%eax
  movsd  %xmm0,0x10(%rsp)
  call   <POP@plt>
  divsd  0x10(%rsp),%xmm0
  call   <PUSH@plt>
  jmp    L139
L110:
  lea    0x10(%rsp),%rdx
  lea    D36(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  test   %eax,%eax
  js     L139
  je     L134
  movsd  0x10(%rsp),%xmm0
  call   <PUSH@plt>
  jmp    L139
L134:
  lea    D21(%rip),%rdi
  call   <printf@plt>
  jmp    L139
L69:
  call   <sqrt@plt>
  jmp    L165
```

tool_calls: name: retrieve_data
arguments: data_tag: D109
type_infered: string
name: retrieve_data
arguments: data_tag: D62
type_infered: string
name: retrieve_data
arguments: data_tag: D29
type_infered: string
name: retrieve_data
arguments: data_tag: D92
type_infered: string
name: retrieve_data
arguments: data_tag: D105
type_infered: string
name: retrieve_data
arguments: data_tag: D83
type_infered: string
name: retrieve_data
arguments: data_tag: D37
type_infered: string
name: retrieve_data
arguments: data_tag: D8
type_infered: string
name: retrieve_data
arguments: data_tag: D31
type_infered: string
name: retrieve_data
arguments: data_tag: D36
type_infered: string
name: retrieve_data
arguments: data_tag: D21
type_infered: string

tool: D109: dup

tool: D62: clear

tool: D29: exit

tool: D92: quit

tool: D105: sqrt

tool: D83: +

tool: D37: -

tool: D8: *

tool: D31: /

tool: D36: %lf

tool: D21: Invalid Input


assistant: ```c
void parse_word(char word[]) {
  int string_s;
  double x;
  if (strcmp(word, "dup") == 0)
    duplicate();
  else if (strcmp(word, "clear") == 0)
    clear();
  else if (strcmp(word, "exit") == 0)
    exit(0);
  else if (strcmp(word, "quit") == 0)
    exit(0);
  else if (strcmp(word, "sqrt") == 0)
    PUSH(sqrt(POP()));
  else if (strcmp(word, "+") == 0)
    PUSH(POP() + POP());
  else if (strcmp(word, "-") == 0) {
    x = POP();
    PUSH(POP() - x);
  } else if (strcmp(word, "*") == 0)
    PUSH(POP() * POP());
  else if (strcmp(word, "/") == 0) {
    x = POP();
    PUSH(POP() / x);
  } else {
    string_s = sscanf(word, "%lf", &x);
    if (string_s < 0)
      return;
    if (string_s == 0) {
      printf("Invalid Input\n");
      return;
    }
    PUSH(x);
  }
  return;
}
```