user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<main>:
  endbr64
  push   %r12
  lea    D111(%rip),%rsi
  lea    D90(%rip),%rdi
  push   %rbp
  lea    D56(%rip),%r12
  sub    $0x8,%rsp
  call   <argv_create@plt>
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <argv_length@plt>
  xor    %edi,%edi
  cmp    $0x3,%eax
  sete   %dil
  call   <assert@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <argv_append@plt>
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <argv_length@plt>
  xor    %edi,%edi
  cmp    $0x4,%eax
  sete   %dil
  call   <assert@plt>
  mov    0x0(%rbp),%rdi
  lea    D11(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  test   %rax,%rax
  sete   %dil
  call   <assert@plt>
  mov    0x8(%rbp),%rdi
  lea    D118(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  test   %rax,%rax
  sete   %dil
  call   <assert@plt>
  mov    0x10(%rbp),%rdi
  lea    D51(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  test   %rax,%rax
  sete   %dil
  call   <assert@plt>
  mov    0x18(%rbp),%rdi
  mov    %r12,%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  test   %rax,%rax
  sete   %dil
  call   <assert@plt>
  xor    %edi,%edi
  cmpq   $0x0,0x20(%rbp)
  sete   %dil
  call   <assert@plt>
  mov    %rbp,%rdi
  call   <argv_destroy@plt>
  lea    D110(%rip),%rsi
  lea    D15(%rip),%rdi
  call   <argv_create@plt>
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <argv_length@plt>
  xor    %edi,%edi
  cmp    $0x4,%eax
  sete   %dil
  call   <assert@plt>
  mov    0x0(%rbp),%rdi
  lea    D30(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  test   %rax,%rax
  sete   %dil
  call   <assert@plt>
  mov    0x8(%rbp),%rdi
  lea    D100(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  test   %rax,%rax
  sete   %dil
  call   <assert@plt>
  mov    0x10(%rbp),%rdi
  lea    D25(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  test   %rax,%rax
  sete   %dil
  call   <assert@plt>
  mov    0x18(%rbp),%rdi
  lea    D62(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  test   %rax,%rax
  sete   %dil
  call   <assert@plt>
  xor    %edi,%edi
  cmpq   $0x0,0x20(%rbp)
  sete   %dil
  call   <assert@plt>
  mov    %rbp,%rdi
  call   <argv_destroy@plt>
  xor    %edi,%edi
  call   <exit@plt>
  add    $0x8,%rsp
  xor    %eax,%eax
  pop    %rbp
  pop    %r12
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D111
type: string
name: extract_symbolic_data
arguments: tag: D90
type: string
name: extract_symbolic_data
arguments: tag: D56
type: string
name: extract_symbolic_data
arguments: tag: D11
type: string
name: extract_symbolic_data
arguments: tag: D118
type: string
name: extract_symbolic_data
arguments: tag: D51
type: string
name: extract_symbolic_data
arguments: tag: D110
type: string
name: extract_symbolic_data
arguments: tag: D15
type: string
name: extract_symbolic_data
arguments: tag: D30
type: string
name: extract_symbolic_data
arguments: tag: D100
type: string
name: extract_symbolic_data
arguments: tag: D25
type: string
name: extract_symbolic_data
arguments: tag: D62
type: string

tool: 

tool: D90: foo bar baz

tool: D56: bonk

tool: D11: foo

tool: D118: bar

tool: D51: baz

tool: D110: ,:

tool: D15: a,b:c d

tool: D30: a

tool: D100: b

tool: D25: c

tool: D62: d

assistant: ```c
int main(int argc, char *argv[]) {
  char **av;
  av = argv_create("foo bar baz", "");
  assert(argv_length(av) == 3);
  av = argv_append(av, "bonk");
  assert(argv_length(av) == 4);
  assert(strcmp(av[0], "foo") == 0);
  assert(strcmp(av[1], "bar") == 0);
  assert(strcmp(av[2], "baz") == 0);
  assert(strcmp(av[3], "bonk") == 0);
  assert(av[4] == NULL);
  argv_destroy(av);
  av = argv_create("a,b:c d", ",:");
  assert(argv_length(av) == 4);
  assert(strcmp(av[0], "a") == 0);
  assert(strcmp(av[1], "b") == 0);
  assert(strcmp(av[2], "c") == 0);
  assert(strcmp(av[3], "d") == 0);
  assert(av[4] == NULL);
  argv_destroy(av);
  exit(0);
}
```