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

```asm
<command_help>:
  endbr64
  push   %rbp
  mov    0x8(%rsi),%rbp
  test   %rbp,%rbp
  je     L38
  lea    D96(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L42
  lea    D72(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L66
  lea    D137(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L39
  lea    D53(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L46
  lea    D68(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L25
  lea    D103(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  jne    L5
  lea    D44(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   0x0(%rax)
L5:
  mov    %rbp,%rsi
  lea    D122(%rip),%rdi
  call   <printf@plt>
  lea    D18(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   0x0(%rax)
L39:
  lea    D148(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L38:
  lea    D136(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L42:
  lea    D133(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L66:
  lea    D63(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L46:
  lea    D145(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L25:
  lea    D116(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
```

tool_calls: name: read_data
arguments: label: D96
datatype: string
name: read_data
arguments: label: D72
datatype: string
name: read_data
arguments: label: D137
datatype: string
name: read_data
arguments: label: D53
datatype: string
name: read_data
arguments: label: D68
datatype: string
name: read_data
arguments: label: D103
datatype: string
name: read_data
arguments: label: D44
datatype: string
name: read_data
arguments: label: D122
datatype: string
name: read_data
arguments: label: D18
datatype: string
name: read_data
arguments: label: D148
datatype: string
name: read_data
arguments: label: D136
datatype: string
name: read_data
arguments: label: D133
datatype: string
name: read_data
arguments: label: D63
datatype: string
name: read_data
arguments: label: D145
datatype: string
name: read_data
arguments: label: D116
datatype: string

tool: D96: flat

tool: D72: help

tool: D137: istore

tool: D53: gmap

tool: D68: time

tool: D103: quit

tool: D44: Quit.  It quits.


tool: D122: Sorry, no help on "%s"


tool: D18: Available: flat help istore time

tool: D148: ISTORE is an indexed table of fixed- but variable-sized structures.
Commands:
    istore open [path]         -- open or create the database in <path>
    istore close               -- close the currently open database
    istore remove [path]       -- rm -rf the database files
    istore write [[N] size]    -- create 1 (or <N>) objects of size <size>
    istore read N [size]       -- access object #n (and print <size> bytes)
    istore next-id             -- print the next ID that would be allocated


tool: D136: Addb is a test client for libaddb.a, the attention deficit datab--OOH, SHINY!
For help on a command, use "help command".  Quickreference:
    help [command]       flat open [path [data]]    istore open [path]
    quit                 flat close                 istore close
    time                 flat remove [path]         istore remove [path]
    time [on / off]      flat read [nbytes]         istore read N [nbytes]
    time now             flat write data            istore write [[N] size]


tool: D133: FLAT is a very simple single piece of storage that can be read and
written as a whole.  It never changes its size.
Commands:
    flat open [path] [data]    -- open or create the database in <path>;
                                  if new, fill it with <data> (default:
                                  "Hello, World!")
    flat close                 -- close the currently open database
    flat remove [path]         -- remove the database file <path>
    flat write [data]	        -- write <data> into the flat database
    flat read [N]              -- read data (and dump N bytes)


tool: D63: To get more detailed help on a subject, type "help <subject>".
Subjects are:
    help   -- you're reading it
    flat   -- flat database commands
    istore -- indexed database commands
    gmap   -- map database commands
    time   -- monitoring execution time


tool: D145: GMAP maps indices to sets of indices.
Commands:
    gmap open [path]           -- open or create the database in <path>
    gmap close                 -- close the currently open database
    gmap remove [path]         -- rm -rf the database files
    gmap add N M               -- add <M> to the index set for <N>
    gmap read N                -- print the index set for <N>


tool: D116: A special "time" flag, if set, causes command execution times
to be printed along with the results.  It can be set interactively,
or from the addb command line with -t.
Commands:
    time                       -- print whether timing is on or off
    time now                   -- print current time
    time on                    -- start printing execution times
    time off                   -- stop printing execution times


assistant: ```c
void command_help(char const *progname, char const *const *argv, char const *filename, int line) {
  if (argv[1]) {
    if (!strcasecmp(argv[1], "flat"))
      puts("FLAT is a very simple single piece of storage that can be read and\n"
           "written as a whole.  It never changes its size.\n"
           "Commands:\n"
           "    flat open [path] [data]    -- open or create the database in "
           "<path>;\n"
           "                                  if new, fill it with <data> "
           "(default:\n"
           "                                  \"Hello, World!\")\n"
           "    flat close                 -- close the currently open "
           "database\n"
           "    flat remove [path]         -- remove the database file <path>\n"
           "    flat write [data]	        -- write <data> into the flat "
           "database\n"
           "    flat read [N]              -- read data (and dump N bytes)\n");
    else if (!strcasecmp(argv[1], "help"))
      puts("To get more detailed help on a subject, type \"help <subject>\".\n"
           "Subjects are:\n"
           "    help   -- you're reading it\n"
           "    flat   -- flat database commands\n"
           "    istore -- indexed database commands\n"
           "    gmap   -- map database commands\n"
           "    time   -- monitoring execution time\n");
    else if (!strcasecmp(argv[1], "istore"))
      puts("ISTORE is an indexed table of fixed- but variable-sized "
           "structures.\n"
           "Commands:\n"
           "    istore open [path]         -- open or create the database in "
           "<path>\n"
           "    istore close               -- close the currently open "
           "database\n"
           "    istore remove [path]       -- rm -rf the database files\n"
           "    istore write [[N] size]    -- create 1 (or <N>) objects of size "
           "<size>\n"
           "    istore read N [size]       -- access object #n (and print "
           "<size> bytes)\n"
           "    istore next-id             -- print the next ID that would be "
           "allocated\n");
    else if (!strcasecmp(argv[1], "gmap"))
      puts("GMAP maps indices to sets of indices.\n"
           "Commands:\n"
           "    gmap open [path]           -- open or create the database in "
           "<path>\n"
           "    gmap close                 -- close the currently open "
           "database\n"
           "    gmap remove [path]         -- rm -rf the database files\n"
           "    gmap add N M               -- add <M> to the index set for <N>\n"
           "    gmap read N                -- print the index set for <N>\n");
    else if (!strcasecmp(argv[1], "time"))
      puts("A special \"time\" flag, if set, causes command execution times\n"
           "to be printed along with the results.  It can be set "
           "interactively,\n"
           "or from the addb command line with -t.\n"
           "Commands:\n"
           "    time                       -- print whether timing is on or "
           "off\n"
           "    time now                   -- print current time\n"
           "    time on                    -- start printing execution times\n"
           "    time off                   -- stop printing execution times\n");
    else if (!strcasecmp(argv[1], "quit"))
      puts("Quit.  It quits.\n");
    else {
      printf("Sorry, no help on \"%s\"\n", argv[1]);
      puts("Available: flat help istore time");
      return;
    }
    return;
  }
  puts("Addb is a test client for libaddb.a, the attention deficit datab--OOH, "
       "SHINY!\n"
       "For help on a command, use \"help command\".  Quickreference:\n"
       "    help [command]       flat open [path [data]]    istore open [path]\n"
       "    quit                 flat close                 istore close\n"
       "    time                 flat remove [path]         istore remove "
       "[path]\n"
       "    time [on / off]      flat read [nbytes]         istore read N "
       "[nbytes]\n"
       "    time now             flat write data            istore write [[N] "
       "size]\n");
}
```