user: What is the c source code of the assembly code below?

```asm
<my_cmd_demo>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %edi,%ebx
  mov    %rsi,%rbp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    D20(%rip),%rax
  mov    %rax,(%rsp)
  lea    D63(%rip),%rax
  mov    %rax,0x8(%rsp)
  movq   $0x0,0x10(%rsp)
  mov    %rsp,%rdx
  lea    D34(%rip),%rsi
  call   <check_cmd@plt>
  test   %rax,%rax
  jne    L96
  mov    0x0(%rbp),%rsi
  lea    D87(%rip),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L37
  lea    D5(%rip),%rcx
  mov    $0x1,%edx
  mov    $0x1,%esi
  mov    %ebx,%edi
  call   <check_argc@plt>
  test   %rax,%rax
  jne    L102
  call   <get_demo@plt>
  mov    %eax,%esi
  lea    D60(%rip),%rdi
  call   <printf@plt>
  mov    $0x0,%eax
L127:
  mov    0x18(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L83
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  ret
L37:
  mov    0x0(%rbp),%rsi
  lea    D56(%rip),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L19
  lea    D19(%rip),%rcx
  mov    $0x2,%edx
  mov    $0x2,%esi
  mov    %ebx,%edi
  call   <check_argc@plt>
  test   %rax,%rax
  jne    L13
  mov    0x8(%rbp),%rdi
  call   <extract_val@plt>
  mov    %rax,%rdi
  lea    -0x1(%rax),%rax
  cmp    $0x2,%rax
  ja     L1
  call   <set_demo@plt>
  mov    $0x0,%eax
  call   <get_demo@plt>
  mov    %eax,%esi
  lea    D58(%rip),%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  jmp    L127
L1:
  mov    0x8(%rbp),%rdi
  call   <print_unknown_arg@plt>
  mov    $0xffffffff,%eax
  jmp    L127
L19:
  mov    0x0(%rbp),%rdi
  call   <print_unknown_cmd@plt>
  mov    $0xffffffff,%eax
  jmp    L127
L96:
  mov    $0xffffffff,%eax
  jmp    L127
L102:
  mov    $0xffffffff,%eax
  jmp    L127
L13:
  mov    $0xffffffff,%eax
  jmp    L127
L83:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_tag: D20
datatype: string
name: parse_data
arguments: data_tag: D63
datatype: string
name: parse_data
arguments: data_tag: D34
datatype: string
name: parse_data
arguments: data_tag: D87
datatype: string
name: parse_data
arguments: data_tag: D5
datatype: string
name: parse_data
arguments: data_tag: D60
datatype: string
name: parse_data
arguments: data_tag: D56
datatype: string
name: parse_data
arguments: data_tag: D19
datatype: string
name: parse_data
arguments: data_tag: D58
datatype: string

tool: D20: set   load demo (1 | 2 | 3)

tool: D63: get   print current demo configuration

tool: D34: demo

tool: D87: get

tool: 

tool: D60: demo configuration %d


tool: D56: set

tool: D19: demo set ID

tool: D58: selecting demo %d


assistant: ```c
int my_cmd_demo(int argc, char **argv) {
  char *usage[] = {"set   load demo (1 | 2 | 3)", "get   print current demo configuration", 0};
  if (check_cmd(argc, "demo", usage))
    return -1;
  if (strcmp("get", argv[0]) == 0) {
    if (check_argc(argc, 1, 1, ""))
      return -1;
    printf("demo configuration %d\n", get_demo());
  } else if (strcmp("set", argv[0]) == 0) {
    if (check_argc(argc, 2, 2, "demo set ID"))
      return -1;
    unsigned long val = extract_val(argv[1]);
    if ((val < 1) || (val > 3)) {
      print_unknown_arg(argv[1]);
      return -1;
    }
    set_demo(val);
    printf("selecting demo %d\n", get_demo());
  } else {
    print_unknown_cmd(argv[0]);
    return -1;
  }
  return 0;
}
```