user: 请将以下的汇编代码转换成C语言代码：

```asm
<test_urldecode>:
  endbr64
  sub    $0x98,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  movq   $0x0,(%rsp)
  movq   $0x0,0x8(%rsp)
  movq   $0x0,0x10(%rsp)
  movq   $0x0,0x18(%rsp)
  movq   $0x0,0x20(%rsp)
  movq   $0x0,0x28(%rsp)
  movq   $0x0,0x30(%rsp)
  movq   $0x0,0x38(%rsp)
  movq   $0x0,0x40(%rsp)
  movq   $0x0,0x48(%rsp)
  movq   $0x0,0x50(%rsp)
  movq   $0x0,0x58(%rsp)
  movq   $0x0,0x60(%rsp)
  movq   $0x0,0x68(%rsp)
  movq   $0x0,0x70(%rsp)
  movq   $0x0,0x78(%rsp)
  mov    %rsp,%rdi
  mov    $0x80,%edx
  lea    D81(%rip),%rsi
  call   <urldecode@plt>
  test   %eax,%eax
  je     L33
  mov    %rsp,%rdi
  lea    D71(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L41
  lea    D55(%rip),%rsi
  lea    D163(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L26:
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L40
  add    $0x98,%rsp
  ret
L33:
  lea    D49(%rip),%rdx
  lea    D136(%rip),%rsi
  lea    D28(%rip),%rdi
  call   <printf@plt>
  lea    D55(%rip),%rsi
  lea    D106(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L26
L41:
  lea    D86(%rip),%rdx
  lea    D6(%rip),%rsi
  lea    D132(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rsp,%rsi
  lea    D158(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D71(%rip),%rsi
  lea    D97(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D55(%rip),%rsi
  lea    D106(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L26
L40:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: tag: D81
type: string
name: retrieve_data
arguments: tag: D71
type: string
name: retrieve_data
arguments: tag: D55
type: string
name: retrieve_data
arguments: tag: D163
type: string
name: retrieve_data
arguments: tag: D49
type: string
name: retrieve_data
arguments: tag: D136
type: string
name: retrieve_data
arguments: tag: D28
type: string
name: retrieve_data
arguments: tag: D106
type: string
name: retrieve_data
arguments: tag: D86
type: string
name: retrieve_data
arguments: tag: D6
type: string
name: retrieve_data
arguments: tag: D132
type: string
name: retrieve_data
arguments: tag: D158
type: string
name: retrieve_data
arguments: tag: D97
type: string

tool: D81: %26bla+r

tool: D71: &bla r

tool: D55: test_urldecode

tool: D163: %s -> OK


tool: D49: Failed to decode.

tool: D136: urldecode(dest, param, 128)

tool: D28: [%s] failed: %s


tool: D106: %s -> FAILED


tool: D86: "&bla r"

tool: D6: dest

tool: D132: expected [%s == %s]


tool: D158:  a = "%s"


tool: D97:  b = "%s"


assistant: ```c
void test_urldecode() {
  char *param = "%26bla+r";
  char dest[128] = {
      0,
  };
  do {
    if (!urldecode(dest, param, 128)) {
      printf("[%s] failed: %s\n", "urldecode(dest, param, 128)", "Failed to decode.");
      printf("%s -> FAILED\n", __func__);
      return;
    }
  } while (0);
  do {
    if (strcmp(dest, "&bla r")) {
      printf("expected [%s == %s]\n", "dest", "\"&bla r\"");
      printf(" a = \"%s\"\n", dest);
      printf(" b = \"%s\"\n", "&bla r");
      printf("%s -> FAILED\n", __func__);
      return;
    }
  } while (0);
  printf("%s -> OK\n", __func__);
}
```