user: Converte this assembly snippet into its equivalent C code:

```asm
<command_dispatcher>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  lea    -0xf4000(%rsp),%r11
L639:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L639
  sub    $0x260,%rsp
  lea    D174(%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    L447
  cmpl   $0x74697571,0x6(%rsp)
  je     L124
L170:
  cmpl   $0x6e756f6d,0x6(%rsp)
  je     L728
L216:
  cmpl   $0x756f6d77,0x6(%rsp)
  je     L340
L626:
  cmpl   $0x756f6d75,0x6(%rsp)
  je     L767
L338:
  cmpw   $0x6463,0x6(%rsp)
  je     L663
L11:
  cmpw   $0x736c,0x6(%rsp)
  je     L36
L140:
  cmpl   $0x6564736c,0x6(%rsp)
  je     L274
L389:
  cmpl   $0x69616863,0x6(%rsp)
  je     L270
L625:
  cmpl   $0x746166,0x6(%rsp)
  je     L487
  movabs $0x7461665f706d7564,%rax
  cmp    %rax,0x6(%rsp)
  je     L721
L507:
  cmpl   $0x706d7564,0x6(%rsp)
  je     L121
L74:
  cmpl   $0x6d756468,0x6(%rsp)
  je     L452
L723:
  cmpl   $0x656c6564,0x6(%rsp)
  je     L199
L48:
  movabs $0x6574656c65646e75,%rax
  cmp    %rax,0x6(%rsp)
  je     L816
L82:
  cmpl   $0x6f666e69,0x6(%rsp)
  je     L99
L254:
  cmpl   $0x776f6873,0x6(%rsp)
  je     L428
L185:
  movabs $0x7461665f74736574,%rax
  cmp    %rax,0x6(%rsp)
  je     L787
L26:
  lea    D12(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L261
  lea    0x5(%rsp),%rcx
  mov    %r12,%rdx
  lea    D94(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  sub    $0x1,%eax
  jle    L64
  movsbl 0x5(%rsp),%edi
  call   <test_command@plt>
  nopl   (%rax)
L447:
  mov    0xf4258(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L758
  add    $0xf4260,%rsp
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L124:
  cmpb   $0x0,0xa(%rsp)
  jne    L170
  xor    %eax,%eax
  call   <quit_command@plt>
  jmp    L447
  nopl   0x0(%rax)
L728:
  cmpw   $0x74,0xa(%rsp)
  jne    L216
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L819
  mov    %r13,%rdi
  call   <mount_command@plt>
  jmp    L447
  nopl   0x0(%rax,%rax,1)
L663:
  cmpb   $0x0,0x8(%rsp)
  jne    L11
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L447
  mov    %r13,%rdi
  call   <cd_command@plt>
  jmp    L447
  nopl   (%rax)
L340:
  cmpw   $0x746e,0xa(%rsp)
  jne    L626
  cmpb   $0x0,0xc(%rsp)
  jne    L626
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L746
  mov    %r13,%rdi
  call   <wmount_command@plt>
  jmp    L447
  nopw   0x0(%rax,%rax,1)
L767:
  cmpw   $0x746e,0xa(%rsp)
  jne    L338
  cmpb   $0x0,0xc(%rsp)
  jne    L338
  xor    %eax,%eax
  call   <umount_command@plt>
  jmp    L447
  nopl   0x0(%rax)
L270:
  cmpw   $0x6e,0xa(%rsp)
  jne    L625
  xor    %eax,%eax
  lea    0x5(%rsp),%rcx
  mov    %r12,%rdx
  mov    %rbp,%rdi
  lea    D94(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L57
  movsbl 0x5(%rsp),%edi
  call   <chain_command@plt>
  jmp    L447
  nopl   (%rax)
L819:
  lea    D250(%rip),%rdi
  call   <printf@plt>
  jmp    L447
  nopl   0x0(%rax)
L36:
  cmpb   $0x0,0x8(%rsp)
  jne    L140
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L303
  mov    %r13,%rdi
  call   <ls_command@plt>
  jmp    L447
L746:
  lea    D87(%rip),%rdi
  call   <printf@plt>
  jmp    L447
  nopw   0x0(%rax,%rax,1)
L274:
  cmpw   $0x6c,0xa(%rsp)
  jne    L389
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L277
  mov    %r13,%rdi
  call   <lsdel_command@plt>
  jmp    L447
  nopw   0x0(%rax,%rax,1)
L487:
  xor    %eax,%eax
  call   <fat_command@plt>
  jmp    L447
L303:
  xor    %edi,%edi
  call   <ls_command@plt>
  jmp    L447
L721:
  cmpb   $0x0,0xe(%rsp)
  jne    L507
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L649
  mov    %r13,%rdi
  call   <dump_fat_command@plt>
  jmp    L447
L277:
  xor    %edi,%edi
  call   <lsdel_command@plt>
  jmp    L447
L121:
  cmpb   $0x0,0xa(%rsp)
  jne    L74
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L688
  mov    %r13,%rdi
  call   <dump_command@plt>
  jmp    L447
L57:
  lea    D175(%rip),%rdi
  call   <printf@plt>
  jmp    L447
L452:
  cmpw   $0x70,0xa(%rsp)
  jne    L723
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L40
  mov    %r13,%rdi
  call   <hdump_command@plt>
  jmp    L447
L199:
  cmpw   $0x6574,0xa(%rsp)
  jne    L48
  cmpb   $0x0,0xc(%rsp)
  jne    L48
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  sub    $0x1,%eax
  jle    L289
  mov    %r13,%rdi
  call   <delete_command@plt>
  jmp    L447
L649:
  lea    D0(%rip),%rdi
  call   <printf@plt>
  jmp    L447
L816:
  cmpb   $0x0,0xe(%rsp)
  jne    L82
  lea    0x10(%rsp),%r13
  xor    %eax,%eax
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    %r13,%rcx
  lea    D92(%rip),%rsi
  call   <sscanf@plt>
  sub    $0x1,%eax
  jle    L350
  mov    %r13,%rdi
  call   <undelete_command@plt>
  jmp    L447
L688:
  lea    D171(%rip),%rdi
  call   <printf@plt>
  jmp    L447
L99:
  cmpb   $0x0,0xa(%rsp)
  jne    L254
  xor    %eax,%eax
  call   <info_command@plt>
  jmp    L447
L40:
  lea    D154(%rip),%rdi
  call   <printf@plt>
  jmp    L447
L428:
  cmpb   $0x0,0xa(%rsp)
  jne    L185
  xor    %eax,%eax
  lea    0x5(%rsp),%rcx
  mov    %r12,%rdx
  mov    %rbp,%rdi
  lea    D41(%rip),%rsi
  call   <sscanf@plt>
  sub    $0x1,%eax
  jle    L236
  movsbl 0x5(%rsp),%edi
  call   <show_command@plt>
  jmp    L447
L289:
  lea    D113(%rip),%rdi
  call   <printf@plt>
  jmp    L447
L261:
  lea    D69(%rip),%rdi
  call   <printf@plt>
  jmp    L447
L787:
  cmpb   $0x0,0xe(%rsp)
  jne    L26
  xor    %eax,%eax
  call   <test_fat_command@plt>
  jmp    L447
L758:
  call   <__stack_chk_fail@plt>
L350:
  lea    D124(%rip),%rdi
  call   <printf@plt>
  jmp    L447
L236:
  lea    D218(%rip),%rdi
  call   <printf@plt>
  jmp    L447
L64:
  lea    D22(%rip),%rdi
  call   <printf@plt>
  jmp    L447
```

tool_calls: name: extract_symbolic_data
arguments: label: D174
data_type: string
name: extract_symbolic_data
arguments: label: D12
data_type: string
name: extract_symbolic_data
arguments: label: D94
data_type: string
name: extract_symbolic_data
arguments: label: D92
data_type: string
name: extract_symbolic_data
arguments: label: D250
data_type: string
name: extract_symbolic_data
arguments: label: D87
data_type: string
name: extract_symbolic_data
arguments: label: D175
data_type: string
name: extract_symbolic_data
arguments: label: D0
data_type: string
name: extract_symbolic_data
arguments: label: D171
data_type: string
name: extract_symbolic_data
arguments: label: D154
data_type: string
name: extract_symbolic_data
arguments: label: D41
data_type: string
name: extract_symbolic_data
arguments: label: D113
data_type: string
name: extract_symbolic_data
arguments: label: D69
data_type: string
name: extract_symbolic_data
arguments: label: D124
data_type: string
name: extract_symbolic_data
arguments: label: D218
data_type: string
name: extract_symbolic_data
arguments: label: D22
data_type: string

tool: D174: %s

tool: D12: test

tool: D94: %s %u

tool: D92: %s %s

tool: D250: mount mount-device


tool: D87: wmount mount-device


tool: D175: chain cluster-number


tool: D0: dump_fat file-path


tool: D171: dump file-name

tool: D154: hdump file-name

tool: D41: %s %c

tool: D113: delete file-name

tool: D69: 404 Not Found


tool: D124: undelete file-name

tool: D218: show w|c


tool: D22: 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");
  }
}
```