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

```asm
<get_closeless>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,0x18(%rsp)
  mov    %rsi,0x10(%rsp)
  call   <str_len@plt>
  mov    0x10(%rsp),%rdi
  mov    %eax,%ebx
  call   <str_len@plt>
  cmp    %eax,%ebx
  jne    L185
  mov    0x18(%rsp),%r8
  movss  D8(%rip),%xmm0
  xor    %ebx,%ebx
  movzbl (%r8),%esi
  test   %sil,%sil
  je     L104
L254:
  mov    0x10(%rsp),%r9
  movss  D11(%rip),%xmm1
  xor    %edi,%edi
  jmp    L59
  xchg   %ax,%ax
L5:
  addss  %xmm1,%xmm0
L179:
  add    $0x1,%rdi
  movzbl (%r8,%rdi,1),%esi
  test   %sil,%sil
  je     L247
L59:
  movzbl (%r9,%rdi,1),%ecx
  cmp    %sil,%cl
  je     L5
  movzbl (%r8),%eax
  lea    0x1(%r8),%rdx
  test   %al,%al
  jne    L1
  jmp    L11
  nopw   0x0(%rax,%rax,1)
L193:
  movzbl (%rdx),%eax
  add    $0x1,%rdx
  test   %al,%al
  je     L11
L1:
  cmp    %al,%cl
  jne    L193
L11:
  movzbl (%r9),%edx
  lea    0x1(%r9),%rcx
  test   %dl,%dl
  jne    L174
  jmp    L179
  nopl   (%rax)
L218:
  movzbl (%rcx),%edx
  add    $0x1,%rcx
  test   %dl,%dl
  je     L179
L174:
  cmp    %sil,%dl
  jne    L218
  test   %al,%al
  je     L179
  add    $0x1,%rdi
  addss  D16(%rip),%xmm0
  movzbl (%r8,%rdi,1),%esi
  test   %sil,%sil
  jne    L59
  nopw   0x0(%rax,%rax,1)
L247:
  cmp    $0x1,%ebx
  je     L60
L104:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L60:
  lea    0x10(%rsp),%rsi
  lea    0x18(%rsp),%rdi
  movss  %xmm0,0xc(%rsp)
  call   <add_swap@plt>
  movss  0xc(%rsp),%xmm0
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  cs nopw 0x0(%rax,%rax,1)
L185:
  mov    0x10(%rsp),%rdi
  xor    %ebx,%ebx
  call   <str_len@plt>
  mov    0x18(%rsp),%rdi
  mov    %eax,%ebp
  call   <str_len@plt>
  cmp    %eax,%ebp
  jl     L204
L167:
  mov    0x18(%rsp),%rdi
  call   <str_len@plt>
  mov    0x10(%rsp),%rdi
  pxor   %xmm0,%xmm0
  movslq %eax,%r12
  mov    %r12,%rbp
  mov    %r12,%r13
  nopl   0x0(%rax)
L17:
  movss  %xmm0,0xc(%rsp)
  call   <str_len@plt>
  movss  0xc(%rsp),%xmm0
  mov    %eax,%r8d
  mov    %ebp,%eax
  sub    %r12d,%eax
  add    %r13d,%eax
  cmp    %eax,%r8d
  jle    L172
  mov    0x18(%rsp),%rax
  mov    0x10(%rsp),%rdi
  movzbl (%rax),%edx
  test   %dl,%dl
  je     L65
  movzbl (%rdi,%r13,1),%ecx
  add    $0x1,%rax
  jmp    L32
  nopl   (%rax)
L0:
  movzbl (%rax),%edx
  add    $0x1,%rax
  test   %dl,%dl
  je     L65
L32:
  cmp    %dl,%cl
  jne    L0
  addss  D16(%rip),%xmm0
L65:
  add    $0x1,%r13
  jmp    L17
  nopl   (%rax)
L172:
  mov    0x18(%rsp),%r8
  movzbl (%r8),%esi
  test   %sil,%sil
  jne    L254
  jmp    L247
L204:
  lea    0x10(%rsp),%rsi
  lea    0x18(%rsp),%rdi
  mov    $0x1,%ebx
  call   <add_swap@plt>
  jmp    L167
```

tool_calls: name: parse_data
arguments: data_label: D8
type_guessed: byte[4]
name: parse_data
arguments: data_label: D11
type_guessed: byte[4]
name: parse_data
arguments: data_label: D16
type_guessed: f32

tool: {"D8": [0x00,0x00,0x80,0x3f]}

tool: {"D11": [0x00,0x00,0x00,0x40]}

tool: D16: 0.5

assistant: ```c
float get_closeless(char *word1, char *word2) {
  int i, j, k, flag = 0;
  float close = 0;
  if (str_len(word1) == str_len(word2))
    close++;
  else {
    if (str_len(word2) < str_len(word1)) {
      add_swap(&word1, &word2);
      flag = 1;
    }
    for (i = str_len(word1); i < str_len(word2); i++) {
      for (j = 0; word1[j] != '\0'; j++) {
        if (word2[i] == word1[j]) {
          close += 0.5;
          break;
        }
      }
    }
  }
  for (i = 0; word1[i] != '\0'; i++) {
    if (word1[i] == word2[i])
      close += 2;
    else {
      for (j = 0; word1[j] != '\0'; j++) {
        if (word2[i] == word1[j])
          break;
      }
      for (k = 0; word2[k] != '\0'; k++) {
        if (word1[i] == word2[k])
          break;
      }
      if ((word1[j] != '\0') && (word2[k] != '\0'))
        close += 0.5;
    }
  }
  if (flag == 1) {
    add_swap(&word1, &word2);
  }
  return close;
}
```