user: 请从给定的汇编指令推导出C源代码：

```asm
<bftmap_example>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    $0x0,%eax
  call   <bftmap_create@plt>
  mov    %rax,-0x88(%rbp)
  movl   $0x0,-0x94(%rbp)
  jmp    L42
L63:
  mov    -0x94(%rbp),%edx
  lea    -0x70(%rbp),%rax
  mov    %edx,%ecx
  lea    D5(%rip),%rdx
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  mov    %eax,-0x8c(%rbp)
  mov    $0x64,%edi
  call   <malloc@plt>
  mov    %rax,-0x78(%rbp)
  mov    -0x94(%rbp),%edx
  mov    -0x78(%rbp),%rax
  mov    %edx,%ecx
  lea    D18(%rip),%rdx
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  mov    -0x78(%rbp),%rcx
  mov    -0x8c(%rbp),%edx
  lea    -0x70(%rbp),%rsi
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <bftmap_put@plt>
  addl   $0x1,-0x94(%rbp)
L42:
  cmpl   $0x3e7,-0x94(%rbp)
  jle    L63
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <bftree_count@plt>
  cmp    $0x3e8,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  movl   $0x0,-0x90(%rbp)
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <bftree_get_iterator@plt>
  mov    %rax,-0x80(%rbp)
  jmp    L27
L78:
  addl   $0x1,-0x90(%rbp)
L27:
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <bftree_next@plt>
  test   %rax,%rax
  jne    L78
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <bftree_free_iterator@plt>
  cmpl   $0x3e8,-0x90(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  movl   $0x0,-0x94(%rbp)
  jmp    L26
L13:
  mov    -0x94(%rbp),%edx
  lea    -0x70(%rbp),%rax
  mov    %edx,%ecx
  lea    D5(%rip),%rdx
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  mov    %eax,-0x8c(%rbp)
  mov    -0x8c(%rbp),%edx
  lea    -0x70(%rbp),%rcx
  mov    -0x88(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <bftmap_del@plt>
  addl   $0x1,-0x94(%rbp)
L26:
  cmpl   $0x270f,-0x94(%rbp)
  jle    L13
  movl   $0x0,-0x94(%rbp)
  jmp    L5
L37:
  mov    -0x94(%rbp),%edx
  lea    -0x70(%rbp),%rax
  mov    %edx,%ecx
  lea    D5(%rip),%rdx
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  mov    %eax,-0x8c(%rbp)
  mov    -0x8c(%rbp),%edx
  lea    -0x70(%rbp),%rcx
  mov    -0x88(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <bftmap_get@plt>
  addl   $0x1,-0x94(%rbp)
L5:
  cmpl   $0x3e7,-0x94(%rbp)
  jle    L37
  mov    -0x88(%rbp),%rax
  mov    %rax,%rdi
  call   <bftmap_free@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L88
  call   <__stack_chk_fail@plt>
L88:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D5
type_guessed: string
name: retrieve_data
arguments: label: D18
type_guessed: string

tool: D5: key%d

tool: D18: val%d

assistant: ```c
void bftmap_example() {
  struct bftree *tree;
  int i, len;
  char buf[100];
  char *val;
  struct bftree_iterator *iter;
  int count;
  tree = bftmap_create();
  for (i = 0; i < 1000; i++) {
    len = snprintf(buf, 100, "key%d", i);
    val = malloc(100);
    snprintf(val, 100, "val%d", i);
    bftmap_put(tree, buf, len, val);
  }
  assert(bftree_count(tree) == 1000);
  count = 0;
  iter = bftree_get_iterator(tree);
  while (bftree_next(iter) != NULL)
    count++;
  bftree_free_iterator(iter);
  assert(count == 1000);
  for (i = 0; i < 10000; i++) {
    len = snprintf(buf, 100, "key%d", i);
    bftmap_del(tree, buf, len);
  }
  for (i = 0; i < 1000; i++) {
    len = snprintf(buf, 100, "key%d", i);
    bftmap_get(tree, buf, len);
  }
  bftmap_free(tree);
}
```