user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<match_uni>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x30(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,-0x20(%rbp)
  cmpq   $0x6,-0x20(%rbp)
  jbe    L5
  mov    -0x20(%rbp),%rax
  sub    $0x3,%rax
  and    $0x3,%eax
  test   %rax,%rax
  jne    L5
  mov    -0x48(%rbp),%rax
  mov    $0x3,%edx
  mov    %rax,%rsi
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L5
  mov    -0x48(%rbp),%rax
  add    $0x3,%rax
  mov    %rax,%rdi
  call   <string_is_hex@plt>
  test   %rax,%rax
  je     L5
  mov    -0x20(%rbp),%rax
  sub    $0x3,%rax
  shr    $0x2,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  shl    $0x2,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  je     L5
  mov    -0x18(%rbp),%rax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
  movq   $0x0,-0x28(%rbp)
  jmp    L26
L95:
  mov    -0x28(%rbp),%rax
  shl    $0x2,%rax
  lea    0x3(%rax),%rdx
  mov    -0x48(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  lea    -0xd(%rbp),%rax
  mov    $0x4,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  movb   $0x0,-0x9(%rbp)
  lea    -0xd(%rbp),%rax
  mov    $0x10,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <strtoul@plt>
  mov    %eax,-0x34(%rbp)
  cmpl   $0xd7ff,-0x34(%rbp)
  jbe    L55
  cmpl   $0xdfff,-0x34(%rbp)
  jbe    L11
  cmpl   $0xffff,-0x34(%rbp)
  ja     L11
L55:
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rax,%rdx
  mov    -0x34(%rbp),%eax
  mov    %eax,(%rdx)
  jmp    L18
L11:
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  movq   $0x0,-0x30(%rbp)
L18:
  addq   $0x1,-0x28(%rbp)
L26:
  cmpq   $0x0,-0x30(%rbp)
  je     L5
  mov    -0x28(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jb     L95
L5:
  mov    -0x30(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L76
  call   <__stack_chk_fail@plt>
L76:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D7
type: string

tool: D7: uni

assistant: ```c
unsigned int *match_uni(const char *name) {
  unsigned int *unicode_string;
  size_t name_length;
  unicode_string = NULL;
  name_length = strlen(name);
  if (7 <= name_length && (name_length - 3) % 4 == 0 && strncmp("uni", name, 3) == 0 && string_is_hex(name + 3)) {
    const size_t word_count = (name_length - 3) / 4;
    unicode_string = malloc((word_count + 1) * sizeof(*unicode_string));
    if (unicode_string != NULL) {
      size_t i;
      char substring[5];
      unicode_string[0] = word_count;
      i = 0;
      while (unicode_string != NULL && i < word_count) {
        unsigned int u;
        memcpy(substring, name + 3 + (4 * i), 4);
        substring[4] = '\0';
        u = (unsigned int)strtoul(substring, NULL, 16);
        if ((0x0000 <= u && u <= 0xD7FF) || (0xE000 <= u && u <= 0xFFFF)) {
          unicode_string[i + 1] = u;
        } else {
          free(unicode_string);
          unicode_string = NULL;
        }
        i++;
      }
    }
  }
  return unicode_string;
}
```