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

```asm
<decodeString>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  movzbl (%rsi),%eax
  test   %al,%al
  je     L259
  mov    %edx,%r15d
  lea    -0x1(%rdx),%r12d
  test   %edx,%edx
  je     L259
  mov    %rsi,%rbx
  lea    0x1(%rsi),%r13
  lea    D61(%rip),%rbp
  jmp    L252
  nopw   0x0(%rax,%rax,1)
L117:
  mov    %al,(%r14)
  mov    %r12d,%r15d
  mov    %r13,%rbx
  add    $0x1,%r14
L276:
  movzbl (%rbx),%eax
  lea    0x1(%rbx),%r13
  test   %al,%al
  je     L259
L184:
  lea    -0x1(%r15),%r12d
  test   %r15d,%r15d
  je     L259
L252:
  cmp    $0x25,%al
  jne    L117
  mov    $0x2,%edx
  mov    %rbp,%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  cmp    $0x1,%r12d
  jbe    L199
  test   %rax,%rax
  jne    L199
  add    $0x3,%rbx
  movb   $0x20,(%r14)
  sub    $0x3,%r15d
  add    $0x1,%r14
  movzbl (%rbx),%eax
  lea    0x1(%rbx),%r13
  test   %al,%al
  jne    L184
L259:
  movb   $0x0,(%r14)
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L199:
  mov    $0x5,%edx
  lea    D68(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  cmp    $0x4,%r12d
  seta   0xf(%rsp)
  movzbl 0xf(%rsp),%ecx
  test   %rax,%rax
  jne    L111
  test   %cl,%cl
  je     L111
  mov    $0x6541,%r9d
  sub    $0x6,%r15d
  add    $0x6,%rbx
  add    $0x2,%r14
  mov    %r9w,-0x2(%r14)
  jmp    L276
  nopw   0x0(%rax,%rax,1)
L111:
  mov    $0x5,%edx
  lea    D67(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L98
  cmpb   $0x0,0xf(%rsp)
  je     L98
  mov    $0x6555,%r8d
  sub    $0x6,%r15d
  add    $0x6,%rbx
  add    $0x2,%r14
  mov    %r8w,-0x2(%r14)
  jmp    L276
  nopl   0x0(%rax)
L98:
  mov    $0x5,%edx
  lea    D24(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L307
  cmpb   $0x0,0xf(%rsp)
  je     L307
  mov    $0x654f,%edi
  sub    $0x6,%r15d
  add    $0x6,%rbx
  add    $0x2,%r14
  mov    %di,-0x2(%r14)
  jmp    L276
  nopl   0x0(%rax,%rax,1)
L307:
  mov    $0x5,%edx
  lea    D5(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L63
  cmpb   $0x0,0xf(%rsp)
  je     L63
  mov    $0x6561,%esi
  sub    $0x6,%r15d
  add    $0x6,%rbx
  add    $0x2,%r14
  mov    %si,-0x2(%r14)
  jmp    L276
  nopl   0x0(%rax,%rax,1)
L63:
  mov    $0x5,%edx
  lea    D10(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L119
  cmpb   $0x0,0xf(%rsp)
  je     L119
  mov    $0x6575,%ecx
  sub    $0x6,%r15d
  add    $0x6,%rbx
  add    $0x2,%r14
  mov    %cx,-0x2(%r14)
  jmp    L276
  nopl   0x0(%rax,%rax,1)
L119:
  mov    $0x5,%edx
  lea    D70(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L251
  cmpb   $0x0,0xf(%rsp)
  je     L251
  mov    $0x656f,%edx
  sub    $0x6,%r15d
  add    $0x6,%rbx
  add    $0x2,%r14
  mov    %dx,-0x2(%r14)
  jmp    L276
L251:
  mov    $0x5,%edx
  lea    D41(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L186
  cmpb   $0x0,0xf(%rsp)
  jne    L182
L186:
  mov    %r12d,%r15d
  mov    %r13,%rbx
  jmp    L276
L182:
  mov    $0x7373,%eax
  sub    $0x6,%r15d
  add    $0x6,%rbx
  add    $0x2,%r14
  mov    %ax,-0x2(%r14)
  jmp    L276
```

tool_calls: name: parse_data
arguments: data_tag: D61
type_guessed: string
name: parse_data
arguments: data_tag: D68
type_guessed: string
name: parse_data
arguments: data_tag: D67
type_guessed: string
name: parse_data
arguments: data_tag: D24
type_guessed: string
name: parse_data
arguments: data_tag: D5
type_guessed: string
name: parse_data
arguments: data_tag: D10
type_guessed: string
name: parse_data
arguments: data_tag: D70
type_guessed: string
name: parse_data
arguments: data_tag: D41
type_guessed: string

tool: D61: 20

tool: D68: C3%84;

tool: D67: C3%9C;

tool: D24: C3%96;

tool: D5: C3%A4;

tool: D10: C3%BC;

tool: D70: C3%B6;

tool: D41: C3%9F;

assistant: ```c
void decodeString(char *dest, char *src, unsigned int len) {
  char c;
  while ((c = *src++) && len--) {
    if (c == '%') {
      if (strncmp(src, "20", 2) == 0 && len >= 2) {
        *dest++ = ' ';
        len -= 2;
        src += 2;
      } else if (strncmp(src, "C3%84;", 5) == 0 && len >= 5) {
        *dest++ = 'A';
        *dest++ = 'e';
        len -= 5;
        src += 5;
      } else if (strncmp(src, "C3%9C;", 5) == 0 && len >= 5) {
        *dest++ = 'U';
        *dest++ = 'e';
        len -= 5;
        src += 5;
      } else if (strncmp(src, "C3%96;", 5) == 0 && len >= 5) {
        *dest++ = 'O';
        *dest++ = 'e';
        len -= 5;
        src += 5;
      } else if (strncmp(src, "C3%A4;", 5) == 0 && len >= 5) {
        *dest++ = 'a';
        *dest++ = 'e';
        len -= 5;
        src += 5;
      } else if (strncmp(src, "C3%BC;", 5) == 0 && len >= 5) {
        *dest++ = 'u';
        *dest++ = 'e';
        len -= 5;
        src += 5;
      } else if (strncmp(src, "C3%B6;", 5) == 0 && len >= 5) {
        *dest++ = 'o';
        *dest++ = 'e';
        len -= 5;
        src += 5;
      } else if (strncmp(src, "C3%9F;", 5) == 0 && len >= 5) {
        *dest++ = 's';
        *dest++ = 's';
        len -= 5;
        src += 5;
      }
    } else
      *dest++ = c;
  }
  *dest++ = 0;
}
```