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

```asm
<create_dictionary>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  movl   $0x1,-0x1c(%rbp)
  movl   $0xffffffff,-0x18(%rbp)
  movl   $0x0,-0x14(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  sub    $0x1,%eax
  mov    %eax,-0xc(%rbp)
  movss  D31(%rip),%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  D25(%rip),%xmm0
  movss  %xmm0,-0x8(%rbp)
  mov    -0x30(%rbp),%rax
  mov    $0x10000,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  movl   $0x0,-0x20(%rbp)
  jmp    L160
L166:
  cmpl   $0x0,-0x1c(%rbp)
  jne    L6
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L41
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jle    L7
L41:
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x40,%al
  jle    L6
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5a,%al
  jg     L6
L7:
  movl   $0x1,-0x1c(%rbp)
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x18(%rbp)
L6:
  cmpl   $0x1,-0x1c(%rbp)
  jne    L82
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x20(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <word_terminator@plt>
  cmp    $0x1,%eax
  jne    L82
  movl   $0x0,-0x1c(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  js     L82
  mov    -0x20(%rbp),%eax
  lea    0x1(%rax),%esi
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%ecx
  mov    -0x28(%rbp),%rax
  movd   %edx,%xmm0
  mov    %esi,%edx
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <word_to_float@plt>
  mov    %eax,-0x4(%rbp)
  cmpl   $0x3fff,-0x4(%rbp)
  jle    L32
  mov    -0x4(%rbp),%eax
  mov    $0x4000,%edx
  mov    %eax,%esi
  lea    D6(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0xffffffff,%eax
  jmp    L105
L32:
  mov    -0x4(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  movss  D31(%rip),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,-0x14(%rbp)
L82:
  addl   $0x1,-0x20(%rbp)
L160:
  mov    -0x20(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jl     L166
  movl   $0x0,-0x20(%rbp)
  jmp    L24
L25:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  comiss -0x10(%rbp),%xmm0
  jbe    L59
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x10(%rbp)
L59:
  addl   $0x1,-0x20(%rbp)
L24:
  cmpl   $0x3fff,-0x20(%rbp)
  jle    L25
  movl   $0x0,-0x20(%rbp)
  jmp    L9
L45:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  divss  -0x10(%rbp),%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,-0x20(%rbp)
L9:
  cmpl   $0x3fff,-0x20(%rbp)
  jle    L45
  mov    -0x14(%rbp),%eax
L105:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D31
data_type: f32
name: unpack_data
arguments: tag: D25
data_type: byte[4]
name: unpack_data
arguments: tag: D6
data_type: string

tool: D31: 1

tool: {"D25": [0x10,0x73,0x1a,0x44]}

tool: D6: Dictionary size exceeded %d/%d


assistant: ```c
int create_dictionary(char *text, float dictionary[]) {
  int i, state = 1, prev_pos = -1, index, total_words = 0;
  int length = strlen(text) - 1;
  float max = 1, mult = (128 * 128) / (26.0f * 1.02f);
  memset((void *)dictionary, '\0', (128 * 128) * sizeof(float));
  for (i = 0; i < length; i++) {
    if (state == 0) {
      if (((text[i] >= 'a') && (text[i] <= 'z')) || ((text[i] >= 'A') && (text[i] <= 'Z'))) {
        state = 1;
        prev_pos = i;
      }
    }
    if (state == 1) {
      if (word_terminator(text[i], text[i + 1]) == 1) {
        state = 0;
        if (prev_pos > -1) {
          index = (int)word_to_float(text, prev_pos, i + 1, mult);
          if (index >= (128 * 128)) {
            printf("Dictionary size exceeded %d/%d\n", index, (128 * 128));
            return -1;
          } else {
            dictionary[index]++;
            total_words++;
          }
        }
      }
    }
  }
  for (i = 0; i < (128 * 128); i++) {
    if (dictionary[i] > max)
      max = dictionary[i];
  }
  for (i = 0; i < (128 * 128); i++) {
    dictionary[i] /= max;
  }
  return total_words;
}
```