user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %rsi,-0x20(%rbp)
  cmpl   $0x3,-0x14(%rbp)
  je     L200
  mov    $0x1,%edi
  call   <exit@plt>
L200:
  mov    -0x20(%rbp),%rax
  mov    0x8(%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x20(%rbp),%rax
  mov    0x10(%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <output_title@plt>
  mov    -0x8(%rbp),%rax
  lea    D84(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L178
  mov    -0x8(%rbp),%rax
  lea    D178(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L178
  mov    -0x8(%rbp),%rax
  lea    D21(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L178
  mov    -0x8(%rbp),%rax
  lea    D55(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L209
L178:
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_normal@plt>
  jmp    L20
L209:
  mov    -0x8(%rbp),%rax
  lea    D38(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L160
  mov    -0x8(%rbp),%rax
  lea    D88(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L160
  mov    -0x8(%rbp),%rax
  lea    D48(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L215
L160:
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_normal_only_charset2uni@plt>
  jmp    L20
L215:
  mov    -0x8(%rbp),%rax
  lea    D87(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L106
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_cns11643_only_uni2charset@plt>
  jmp    L20
L106:
  mov    -0x8(%rbp),%rax
  lea    D145(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L156
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_gbk1_only_charset2uni@plt>
  jmp    L20
L156:
  mov    -0x8(%rbp),%rax
  lea    D100(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L191
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_gbk2_only_charset2uni@plt>
  jmp    L20
L191:
  mov    -0x8(%rbp),%rax
  lea    D23(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L210
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_gbk1_only_uni2charset@plt>
  jmp    L20
L210:
  mov    -0x8(%rbp),%rax
  lea    D154(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L77
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_gbk1@plt>
  jmp    L20
L77:
  mov    -0x8(%rbp),%rax
  lea    D144(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L116
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_ksc5601@plt>
  jmp    L20
L116:
  mov    -0x8(%rbp),%rax
  lea    D41(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L132
  mov    -0x8(%rbp),%rax
  lea    D44(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L295
L132:
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_big5@plt>
  jmp    L20
L295:
  mov    -0x8(%rbp),%rax
  lea    D117(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L53
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_big5hkscs@plt>
  jmp    L20
L53:
  mov    -0x8(%rbp),%rax
  lea    D60(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L277
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_johab_hangul@plt>
  jmp    L20
L277:
  mov    -0x8(%rbp),%rax
  lea    D160(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L121
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <do_sjis@plt>
  jmp    L20
L121:
  mov    $0x1,%edi
  call   <exit@plt>
L20:
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D84
type: string
name: extract_symbolic_data
arguments: label: D178
type: string
name: extract_symbolic_data
arguments: label: D21
type: string
name: extract_symbolic_data
arguments: label: D55
type: string
name: extract_symbolic_data
arguments: label: D38
type: string
name: extract_symbolic_data
arguments: label: D88
type: string
name: extract_symbolic_data
arguments: label: D48
type: string
name: extract_symbolic_data
arguments: label: D87
type: string
name: extract_symbolic_data
arguments: label: D145
type: string
name: extract_symbolic_data
arguments: label: D100
type: string
name: extract_symbolic_data
arguments: label: D23
type: string
name: extract_symbolic_data
arguments: label: D154
type: string
name: extract_symbolic_data
arguments: label: D144
type: string
name: extract_symbolic_data
arguments: label: D41
type: string
name: extract_symbolic_data
arguments: label: D44
type: string
name: extract_symbolic_data
arguments: label: D117
type: string
name: extract_symbolic_data
arguments: label: D60
type: string
name: extract_symbolic_data
arguments: label: D160
type: string

tool: D84: gb2312

tool: D178: gb12345ext

tool: D21: jisx0208

tool: D55: jisx0212

tool: D38: cns11643_1

tool: D88: cns11643_2

tool: D48: cns11643_3

tool: D87: cns11643_inv

tool: D145: gbkext1

tool: D100: gbkext2

tool: D23: gbkext_inv

tool: D154: cp936ext

tool: D144: ksc5601

tool: D41: big5

tool: D44: cp950ext

tool: D117: big5hkscs

tool: D60: johab_hangul

tool: D160: cp932ext

assistant: ```c
int main(int argc, char *argv[]) {
  const char *charsetname;
  const char *name;
  if (argc != 3)
    exit(1);
  charsetname = argv[1];
  name = argv[2];
  output_title(charsetname);
  if (!strcmp(name, "gb2312") || !strcmp(name, "gb12345ext") || !strcmp(name, "jisx0208") || !strcmp(name, "jisx0212"))
    do_normal(name);
  else if (!strcmp(name, "cns11643_1") || !strcmp(name, "cns11643_2") || !strcmp(name, "cns11643_3"))
    do_normal_only_charset2uni(name);
  else if (!strcmp(name, "cns11643_inv"))
    do_cns11643_only_uni2charset(name);
  else if (!strcmp(name, "gbkext1"))
    do_gbk1_only_charset2uni(name);
  else if (!strcmp(name, "gbkext2"))
    do_gbk2_only_charset2uni(name);
  else if (!strcmp(name, "gbkext_inv"))
    do_gbk1_only_uni2charset(name);
  else if (!strcmp(name, "cp936ext"))
    do_gbk1(name);
  else if (!strcmp(name, "ksc5601"))
    do_ksc5601(name);
  else if (!strcmp(name, "big5") || !strcmp(name, "cp950ext"))
    do_big5(name);
  else if (!strcmp(name, "big5hkscs"))
    do_big5hkscs(name);
  else if (!strcmp(name, "johab_hangul"))
    do_johab_hangul(name);
  else if (!strcmp(name, "cp932ext"))
    do_sjis(name);
  else
    exit(1);
  return 0;
}
```