user: Please show me the C implementation that matches the assembly code listed below:

```asm
<translate_lujvo>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x88(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x6c(%rbp)
  movl   $0x0,-0x74(%rbp)
  mov    -0x88(%rbp),%rax
  mov    %rax,-0x68(%rbp)
  movb   $0x0,D85(%rip)
  movl   $0x1,-0x70(%rbp)
L293:
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    $0x5,%eax
  jne    L460
  lea    -0x74(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <translate_comp@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x70(%rbp),%edx
  mov    -0x58(%rbp),%rax
  lea    D85(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <append_trans@plt>
  jmp    L31
L460:
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    $0x4,%eax
  jg     L366
  lea    -0x50(%rbp),%rax
  lea    D159(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    -0x68(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  lea    -0x74(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <translate_comp@plt>
  mov    %rax,-0x58(%rbp)
  cmpq   $0x0,-0x58(%rbp)
  je     L375
  cmpl   $0x0,-0x70(%rbp)
  jne    L87
  lea    D155(%rip),%rax
  mov    %rax,%rsi
  lea    D85(%rip),%rax
  mov    %rax,%rdi
  call   <strcat@plt>
L87:
  mov    -0x58(%rbp),%rax
  mov    %rax,%rsi
  lea    D85(%rip),%rax
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L31
L375:
  cmpl   $0x0,-0x70(%rbp)
  jne    L70
  lea    D155(%rip),%rax
  mov    %rax,%rsi
  lea    D85(%rip),%rax
  mov    %rax,%rdi
  call   <strcat@plt>
L70:
  lea    D83(%rip),%rax
  mov    %rax,%rsi
  lea    D85(%rip),%rax
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L31
L366:
  mov    -0x68(%rbp),%rax
  mov    $0x79,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x60(%rbp)
  cmpq   $0x0,-0x60(%rbp)
  je     L495
  mov    -0x60(%rbp),%rax
  sub    -0x68(%rbp),%rax
  mov    %eax,-0x6c(%rbp)
L495:
  cmpq   $0x0,-0x60(%rbp)
  je     L258
  cmpl   $0x3,-0x6c(%rbp)
  jne    L258
  mov    -0x68(%rbp),%rax
  mov    $0x3,%edx
  lea    D124(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L343
  movl   $0x2,-0x74(%rbp)
  jmp    L157
L343:
  mov    -0x68(%rbp),%rax
  mov    $0x3,%edx
  lea    D22(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L250
  movl   $0x3,-0x74(%rbp)
  jmp    L157
L250:
  mov    -0x68(%rbp),%rax
  mov    $0x3,%edx
  lea    D136(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L345
  movl   $0x4,-0x74(%rbp)
  jmp    L157
L345:
  mov    -0x68(%rbp),%rax
  mov    $0x3,%edx
  lea    D117(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L397
  movl   $0x5,-0x74(%rbp)
  jmp    L157
L397:
  movb   $0x25,-0x50(%rbp)
  lea    -0x50(%rbp),%rax
  add    $0x1,%rax
  mov    -0x68(%rbp),%rcx
  mov    $0x3,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  movb   $0x0,-0x4c(%rbp)
  lea    -0x74(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <translate_comp@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x70(%rbp),%edx
  mov    -0x58(%rbp),%rax
  lea    D85(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <append_trans@plt>
L157:
  addq   $0x4,-0x68(%rbp)
  jmp    L105
L258:
  cmpq   $0x0,-0x60(%rbp)
  je     L272
  cmpl   $0x4,-0x6c(%rbp)
  jne    L272
  movb   $0x25,-0x50(%rbp)
  lea    -0x50(%rbp),%rax
  add    $0x1,%rax
  mov    -0x68(%rbp),%rcx
  mov    $0x4,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  movb   $0x0,-0x4b(%rbp)
  lea    -0x74(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <translate_comp@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x70(%rbp),%edx
  mov    -0x58(%rbp),%rax
  lea    D85(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <append_trans@plt>
  addq   $0x5,-0x68(%rbp)
  jmp    L105
L272:
  movb   $0x25,-0x50(%rbp)
  mov    -0x68(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x27,%al
  jne    L303
  lea    -0x50(%rbp),%rax
  add    $0x1,%rax
  mov    -0x68(%rbp),%rcx
  mov    $0x4,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  movb   $0x0,-0x4b(%rbp)
  lea    -0x74(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <translate_comp@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x70(%rbp),%edx
  mov    -0x58(%rbp),%rax
  lea    D85(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <append_trans@plt>
  mov    -0x68(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D187(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L97
  mov    -0x68(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D187(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L97
  cmpl   $0x0,-0x70(%rbp)
  je     L97
  mov    -0x68(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L97
  mov    -0x68(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    $0x72,%al
  je     L0
  mov    -0x68(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    $0x6e,%al
  jne    L97
  mov    -0x68(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  cmp    $0x72,%al
  jne    L97
L0:
  addq   $0x5,-0x68(%rbp)
  jmp    L105
L97:
  addq   $0x4,-0x68(%rbp)
  jmp    L105
L303:
  mov    -0x68(%rbp),%rax
  mov    $0x3,%edx
  lea    D124(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L300
  movl   $0x2,-0x74(%rbp)
  jmp    L166
L300:
  mov    -0x68(%rbp),%rax
  mov    $0x3,%edx
  lea    D22(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L10
  movl   $0x3,-0x74(%rbp)
  jmp    L166
L10:
  mov    -0x68(%rbp),%rax
  mov    $0x3,%edx
  lea    D136(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L264
  movl   $0x4,-0x74(%rbp)
  jmp    L166
L264:
  mov    -0x68(%rbp),%rax
  mov    $0x3,%edx
  lea    D117(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L8
  movl   $0x5,-0x74(%rbp)
  jmp    L166
L8:
  lea    -0x50(%rbp),%rax
  add    $0x1,%rax
  mov    -0x68(%rbp),%rcx
  mov    $0x3,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  movb   $0x0,-0x4c(%rbp)
  lea    -0x74(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <translate_comp@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x70(%rbp),%edx
  mov    -0x58(%rbp),%rax
  lea    D85(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <append_trans@plt>
L166:
  mov    -0x68(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D187(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L183
  mov    -0x68(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D187(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L183
  cmpl   $0x0,-0x70(%rbp)
  je     L183
  mov    -0x68(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L183
  mov    -0x68(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  cmp    $0x72,%al
  je     L138
  mov    -0x68(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  cmp    $0x6e,%al
  jne    L183
  mov    -0x68(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    $0x72,%al
  jne    L183
L138:
  addq   $0x4,-0x68(%rbp)
  jmp    L105
L183:
  addq   $0x3,-0x68(%rbp)
L105:
  movl   $0x0,-0x70(%rbp)
  mov    -0x68(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L293
L31:
  lea    D85(%rip),%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L466
  call   <__stack_chk_fail@plt>
L466:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D159
type_infered: string
name: retrieve_data
arguments: data_label: D155
type_infered: string
name: retrieve_data
arguments: data_label: D83
type_infered: string
name: retrieve_data
arguments: data_label: D124
type_infered: string
name: retrieve_data
arguments: data_label: D22
type_infered: string
name: retrieve_data
arguments: data_label: D136
type_infered: string
name: retrieve_data
arguments: data_label: D117
type_infered: string
name: retrieve_data
arguments: data_label: D187
type_infered: string

tool: D159: %

tool: D155: -

tool: D83: ?

tool: D124: sel

tool: D22: ter

tool: D136: vel

tool: D117: xel

tool: D187: aeiou

assistant: ```c
char *translate_lujvo(char *word) {
  static char result[4096];
  char buf[64];
  char *w, *trans;
  int initial;
  char *yy;
  int ypos = 0;
  int conversion = 0;
  w = word;
  result[0] = 0;
  initial = 1;
  do {
    if (strlen(w) == 5) {
      trans = translate_comp(w, &conversion);
      append_trans(trans, result, initial);
      break;
    } else {
      if (strlen(w) < 5) {
        strcpy(buf, "%");
        strcat(buf, w);
        trans = translate_comp(buf, &conversion);
        if (trans) {
          if (!initial) {
            strcat(result, "-");
          }
          strcat(result, trans);
        } else {
          if (!initial) {
            strcat(result, "-");
          }
          strcat(result, "?");
        }
        break;
      } else {
        yy = strchr(w, 'y');
        if (yy) {
          ypos = yy - w;
        }
        if (yy && ypos == 3) {
          if (!strncmp(w, "sel", 3)) {
            conversion = 2;
          } else if (!strncmp(w, "ter", 3)) {
            conversion = 3;
          } else if (!strncmp(w, "vel", 3)) {
            conversion = 4;
          } else if (!strncmp(w, "xel", 3)) {
            conversion = 5;
          } else {
            buf[0] = '%';
            strncpy(buf + 1, w, 3);
            buf[4] = 0;
            trans = translate_comp(buf, &conversion);
            append_trans(trans, result, initial);
          }
          w += 4;
        } else if (yy && ypos == 4) {
          buf[0] = '%';
          strncpy(buf + 1, w, 4);
          buf[5] = 0;
          trans = translate_comp(buf, &conversion);
          append_trans(trans, result, initial);
          w += 5;
        } else {
          buf[0] = '%';
          if (w[2] == '\'') {
            strncpy(buf + 1, w, 4);
            buf[5] = 0;
            trans = translate_comp(buf, &conversion);
            append_trans(trans, result, initial);
            if (strchr("aeiou", w[1]) && strchr("aeiou", w[3]) && initial && w[4] && (w[4] == 'r' || (w[4] == 'n' && w[5] == 'r'))) {
              w += 5;
            } else {
              w += 4;
            }
          } else {
            if (!strncmp(w, "sel", 3)) {
              conversion = 2;
            } else if (!strncmp(w, "ter", 3)) {
              conversion = 3;
            } else if (!strncmp(w, "vel", 3)) {
              conversion = 4;
            } else if (!strncmp(w, "xel", 3)) {
              conversion = 5;
            } else {
              strncpy(buf + 1, w, 3);
              buf[4] = 0;
              trans = translate_comp(buf, &conversion);
              append_trans(trans, result, initial);
            }
            if (strchr("aeiou", w[1]) && strchr("aeiou", w[2]) && initial && w[3] && (w[3] == 'r' || (w[3] == 'n' && w[4] == 'r'))) {
              w += 4;
            } else {
              w += 3;
            }
          }
        }
      }
    }
    initial = 0;
  } while (*w);
  return result;
}
```