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

```asm
<command_dispatcher>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  lea    -0xf4000(%rsp),%r11
L665:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L665
  sub    $0x260,%rsp
  lea    D165(%rip),%rsi
  mov    %fs:0x28,%rax
  mov    %rax,0xf4258(%rsp)
  xor    %eax,%eax
  lea    0x6(%rsp),%r12
  mov    %rdi,%rbp
  mov    %r12,%rdx
  call   <sscanf@plt>
  test   %eax,%eax
  jle    L519
  cmpl   $0x74697571,0x6(%rsp)
  je     L664
L829:
  cmpl   $0x6e756f6d,0x6(%rsp)
  je     L105
L575:
  cmpl   $0x756f6d77,0x6(%rsp)
  je     L528
L209:
  cmpl   $0x756f6d75,0x6(%rsp)
  je     L307
L448:
  cmpw   $0x6463,0x6(%rsp)
  je     L321
L466:
  cmpw   $0x736c,0x6(%rsp)
  je     L159
L34:
  cmpl   $0x6564736c,0x6(%rsp)
  je     L134
L573:
  cmpl   $0x69616863,0x6(%rsp)
  je     L434
L405:
  cmpl   $0x746166,0x6(%rsp)
  je     L810
  movabs $0x7461665f706d7564,%rax
  cmp    %rax,0x6(%rsp)
  je     L258
L273:
  cmpl   $0x706d7564,0x6(%rsp)
  je     L147
L557:
  cmpl   $0x6d756468,0x6(%rsp)
  je     L607
L140:
  cmpl   $0x656c6564,0x6(%rsp)
  je     L447
L468:
  movabs $0x6574656c65646e75,%rax
  cmp    %rax,0x6(%rsp)
  je     L399
L513:
  cmpl   $0x6f666e69,0x6(%rsp)
  je     L288
L571:
  cmpl   $0x776f6873,0x6(%rsp)
  je     L100
L210:
  movabs $0x7461665f74736574,%rax
  cmp    %rax,0x6(%rsp)
  je     L715
L213:
  lea    D210(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L318
  lea    0x5(%rsp),%rcx
  mov    %r12,%rdx
  lea    D151(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  sub    $0x1,%eax
  jle    L428
  movsbl 0x5(%rsp),%edi
  call   <test_command@plt>
  nopl   (%rax)
L519:
  mov    0xf4258(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L543
  add    $0xf4260,%rsp
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L664:
  cmpb   $0x0,0xa(%rsp)
  jne    L829
  xor    %eax,%eax
  call   <quit_command@plt>
  jmp    L519
  nopl   0x0(%rax)
L105:
  cmpw   $0x74,0xa(%rsp)
  jne    L575
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L53
  mov    %r13,%rdi
  call   <mount_command@plt>
  jmp    L519
  nopl   0x0(%rax,%rax,1)
L321:
  cmpb   $0x0,0x8(%rsp)
  jne    L466
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L519
  mov    %r13,%rdi
  call   <cd_command@plt>
  jmp    L519
  nopl   (%rax)
L528:
  cmpw   $0x746e,0xa(%rsp)
  jne    L209
  cmpb   $0x0,0xc(%rsp)
  jne    L209
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L74
  mov    %r13,%rdi
  call   <wmount_command@plt>
  jmp    L519
  nopw   0x0(%rax,%rax,1)
L307:
  cmpw   $0x746e,0xa(%rsp)
  jne    L448
  cmpb   $0x0,0xc(%rsp)
  jne    L448
  xor    %eax,%eax
  call   <umount_command@plt>
  jmp    L519
  nopl   0x0(%rax)
L434:
  cmpw   $0x6e,0xa(%rsp)
  jne    L405
  xor    %eax,%eax
  lea    0x5(%rsp),%rcx
  mov    %r12,%rdx
  mov    %rbp,%rdi
  lea    D151(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L791
  movsbl 0x5(%rsp),%edi
  call   <chain_command@plt>
  jmp    L519
  nopl   (%rax)
L53:
  lea    D145(%rip),%rdi
  call   <printf@plt>
  jmp    L519
  nopl   0x0(%rax)
L159:
  cmpb   $0x0,0x8(%rsp)
  jne    L34
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L291
  mov    %r13,%rdi
  call   <ls_command@plt>
  jmp    L519
L74:
  lea    D78(%rip),%rdi
  call   <printf@plt>
  jmp    L519
  nopw   0x0(%rax,%rax,1)
L134:
  cmpw   $0x6c,0xa(%rsp)
  jne    L573
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L441
  mov    %r13,%rdi
  call   <lsdel_command@plt>
  jmp    L519
  nopw   0x0(%rax,%rax,1)
L810:
  xor    %eax,%eax
  call   <fat_command@plt>
  jmp    L519
L291:
  xor    %edi,%edi
  call   <ls_command@plt>
  jmp    L519
L258:
  cmpb   $0x0,0xe(%rsp)
  jne    L273
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L560
  mov    %r13,%rdi
  call   <dump_fat_command@plt>
  jmp    L519
L441:
  xor    %edi,%edi
  call   <lsdel_command@plt>
  jmp    L519
L147:
  cmpb   $0x0,0xa(%rsp)
  jne    L557
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L239
  mov    %r13,%rdi
  call   <dump_command@plt>
  jmp    L519
L791:
  lea    D106(%rip),%rdi
  call   <printf@plt>
  jmp    L519
L607:
  cmpw   $0x70,0xa(%rsp)
  jne    L140
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L674
  mov    %r13,%rdi
  call   <hdump_command@plt>
  jmp    L519
L447:
  cmpw   $0x6574,0xa(%rsp)
  jne    L468
  cmpb   $0x0,0xc(%rsp)
  jne    L468
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  sub    $0x1,%eax
  jle    L684
  mov    %r13,%rdi
  call   <delete_command@plt>
  jmp    L519
L560:
  lea    D74(%rip),%rdi
  call   <printf@plt>
  jmp    L519
L399:
  cmpb   $0x0,0xe(%rsp)
  jne    L513
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D73(%rip),%rsi
  call   <sscanf@plt>
  sub    $0x1,%eax
  jle    L337
  mov    %r13,%rdi
  call   <undelete_command@plt>
  jmp    L519
L239:
  lea    D178(%rip),%rdi
  call   <printf@plt>
  jmp    L519
L288:
  cmpb   $0x0,0xa(%rsp)
  jne    L571
  xor    %eax,%eax
  call   <info_command@plt>
  jmp    L519
L674:
  lea    D66(%rip),%rdi
  call   <printf@plt>
  jmp    L519
L100:
  cmpb   $0x0,0xa(%rsp)
  jne    L210
  xor    %eax,%eax
  lea    0x5(%rsp),%rcx
  mov    %r12,%rdx
  mov    %rbp,%rdi
  lea    D256(%rip),%rsi
  call   <sscanf@plt>
  sub    $0x1,%eax
  jle    L745
  movsbl 0x5(%rsp),%edi
  call   <show_command@plt>
  jmp    L519
L684:
  lea    D195(%rip),%rdi
  call   <printf@plt>
  jmp    L519
L318:
  lea    D88(%rip),%rdi
  call   <printf@plt>
  jmp    L519
L715:
  cmpb   $0x0,0xe(%rsp)
  jne    L213
  xor    %eax,%eax
  call   <test_fat_command@plt>
  jmp    L519
L543:
  call   <__stack_chk_fail@plt>
L337:
  lea    D186(%rip),%rdi
  call   <printf@plt>
  jmp    L519
L745:
  lea    D207(%rip),%rdi
  call   <printf@plt>
  jmp    L519
L428:
  lea    D98(%rip),%rdi
  call   <printf@plt>
  jmp    L519
```

tool_calls: name: retrieve_data
arguments: tag: D165
datatype: string
name: retrieve_data
arguments: tag: D210
datatype: string
name: retrieve_data
arguments: tag: D151
datatype: string
name: retrieve_data
arguments: tag: D73
datatype: string
name: retrieve_data
arguments: tag: D145
datatype: string
name: retrieve_data
arguments: tag: D78
datatype: string
name: retrieve_data
arguments: tag: D106
datatype: string
name: retrieve_data
arguments: tag: D74
datatype: string
name: retrieve_data
arguments: tag: D178
datatype: string
name: retrieve_data
arguments: tag: D66
datatype: string
name: retrieve_data
arguments: tag: D256
datatype: string
name: retrieve_data
arguments: tag: D195
datatype: string
name: retrieve_data
arguments: tag: D88
datatype: string
name: retrieve_data
arguments: tag: D186
datatype: string
name: retrieve_data
arguments: tag: D207
datatype: string
name: retrieve_data
arguments: tag: D98
datatype: string

tool: D165: %s

tool: D210: test

tool: D151: %s %u

tool: D73: %s %s

tool: D145: mount mount-device


tool: D78: wmount mount-device


tool: D106: chain cluster-number


tool: D74: dump_fat file-path


tool: D178: dump file-name

tool: D66: hdump file-name

tool: D256: %s %c

tool: D195: delete file-name

tool: D88: 404 Not Found


tool: D186: undelete file-name

tool: D207: show w|c


tool: D98: test cluster-number


assistant: ```c
void command_dispatcher(const char *command) {
  char verb[10];
  int len;
  len = sscanf(command, "%s", verb);
  if (len < 1)
    return;
  if (!strcmp(verb, "quit")) {
    quit_command();
  } else if (!strcmp(verb, "mount")) {
    char dev[(1000 * 1000)];
    int len = 0;
    len = sscanf(command, "%s %s", verb, dev);
    if (len < 2) {
      printf("mount mount-device\n");
      return;
    }
    mount_command(dev);
  } else if (!strcmp(verb, "wmount")) {
    char dev[(1000 * 1000)];
    int len = 0;
    len = sscanf(command, "%s %s", verb, dev);
    if (len < 2) {
      printf("wmount mount-device\n");
      return;
    }
    wmount_command(dev);
  } else if (!strcmp(verb, "umount")) {
    umount_command();
  } else if (!strcmp(verb, "cd")) {
    char path[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, path);
    if (len < 2) {
      return;
    }
    cd_command(path);
  } else if (!strcmp(verb, "ls")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      ls_command(NULL);
      return;
    }
    ls_command(dir);
  } else if (!strcmp(verb, "lsdel")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      lsdel_command(NULL);
      return;
    }
    lsdel_command(dir);
  } else if (!strcmp(verb, "chain")) {
    uint32_t index;
    int len;
    len = sscanf(command, "%s %u", verb, &index);
    if (len < 2) {
      printf("chain cluster-number\n");
      return;
    }
    chain_command(index);
  } else if (!strcmp(verb, "fat")) {
    fat_command();
  } else if (!strcmp(verb, "dump_fat")) {
    char path[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, path);
    if (len < 2) {
      printf("dump_fat file-path\n");
      return;
    }
    dump_fat_command(path);
  } else if (!strcmp(verb, "dump")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      printf("dump file-name");
      return;
    }
    dump_command(dir);
  } else if (!strcmp(verb, "hdump")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      printf("hdump file-name");
      return;
    }
    hdump_command(dir);
  } else if (!strcmp(verb, "delete")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      printf("delete file-name");
      return;
    }
    delete_command(dir);
  } else if (!strcmp(verb, "undelete")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      printf("undelete file-name");
      return;
    }
    undelete_command(dir);
  } else if (!strcmp(verb, "info")) {
    info_command();
  } else if (!strcmp(verb, "show")) {
    char c;
    int len;
    len = sscanf(command, "%s %c", verb, &c);
    if (len < 2) {
      printf("show w|c\n");
      return;
    }
    show_command(c);
  } else if (!strcmp(verb, "test_fat")) {
    test_fat_command();
  } else if (!strcmp(verb, "test")) {
    uint32_t index;
    int len;
    len = sscanf(command, "%s %u", verb, &index);
    if (len < 2) {
      printf("test cluster-number\n");
      return;
    }
    test_command(index);
  } else {
    printf("404 Not Found\n");
  }
}
```