// File: dmonaldo[P]simple-network-file-system/FileSys.cpp
// Function: FileSys::execute_command(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
bool FileSys::execute_command(string command_str)
{
  // parse the command line
  struct FileSys::Command command = parse_command(command_str);

  // copy the contents of the string to char array
  const char* command_name = command.name.c_str();
  const char* file_name = command.file_name.c_str();
  const char* append_data = command.append_data.c_str();

  // look for the matching command
  if (command.name == "") {
    return false;
  }
  else if (command.name == "mkdir") {
    mkdir(file_name);
  }
  else if (command.name == "cd") {
    cd(file_name);
  }
  else if (command.name == "home") {
    home();
  }
  else if (command.name == "rmdir") {
    rmdir(file_name);
  }
  else if (command.name == "ls") {
    ls();
  }
  else if (command.name == "create") {
    create(file_name);
  }
  else if (command.name == "append") {
    append(file_name, append_data);
  }
  else if (command.name == "cat") {
    cat(file_name);
  }
  else if (command.name == "head") {
    errno = 0;
    unsigned long n = strtoul(command.append_data.c_str(), NULL, 0);
    if (0 == errno) {
      head(file_name, n);
    } else {
      cerr << "Invalid command line: " << command.append_data;
      cerr << " is not a valid number of bytes" << endl;
      return false;
    }
  }
  else if (command.name == "rm") {
    rm(file_name);
  }
  else if (command.name == "stat") {
    stat(file_name);
  }
  else if (command.name == "quit") {
    return true;
  }

  return false;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x120, %rsp            # imm = 0x120
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xe0(%rbp)
leaq -0x98(%rbp), %rdi
movq %rdi, -0xd8(%rbp)
callq 0x31a0
movq -0xe0(%rbp), %rsi
movq -0xd8(%rbp), %rdx
leaq -0x78(%rbp), %rdi
callq 0x59e0
jmp 0x554a
leaq -0x98(%rbp), %rdi
callq 0x3628
leaq -0x78(%rbp), %rdi
movq %rdi, -0xf0(%rbp)
callq 0x3190
movq %rax, -0xb0(%rbp)
leaq -0x58(%rbp), %rdi
callq 0x3190
movq %rax, -0xb8(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x3190
movq -0xf0(%rbp), %rdi
movq %rax, -0xc0(%rbp)
leaq 0x6b4f(%rip), %rsi      # 0xc0ea
callq 0x6a60
movb %al, -0xe1(%rbp)
jmp 0x55a8
movb -0xe1(%rbp), %al
testb $0x1, %al
jne 0x55b4
jmp 0x560a
movb $0x0, -0x1(%rbp)
movl $0x1, -0xc4(%rbp)
jmp 0x59b7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
leaq -0x98(%rbp), %rdi
callq 0x3628
jmp 0x59ce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x6a90
jmp 0x59ce
leaq 0x6c3d(%rip), %rsi      # 0xc24e
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0xf1(%rbp)
jmp 0x5622
movb -0xf1(%rbp), %al
testb $0x1, %al
jne 0x562e
jmp 0x5648
movq -0xe0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x3fd0
jmp 0x5643
jmp 0x59a7
leaq 0x6c05(%rip), %rsi      # 0xc254
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0xf2(%rbp)
jmp 0x5660
movb -0xf2(%rbp), %al
testb $0x1, %al
jne 0x566c
jmp 0x5686
movq -0xe0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x42d0
jmp 0x5681
jmp 0x59a5
leaq 0x6bca(%rip), %rsi      # 0xc257
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0xf3(%rbp)
jmp 0x569e
movb -0xf3(%rbp), %al
testb $0x1, %al
jne 0x56aa
jmp 0x56bd
movq -0xe0(%rbp), %rdi
callq 0x44c0
jmp 0x56b8
jmp 0x59a3
leaq 0x6b98(%rip), %rsi      # 0xc25c
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0xf4(%rbp)
jmp 0x56d5
movb -0xf4(%rbp), %al
testb $0x1, %al
jne 0x56e1
jmp 0x56fb
movq -0xe0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x4520
jmp 0x56f6
jmp 0x59a1
leaq 0x6b60(%rip), %rsi      # 0xc262
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0xf5(%rbp)
jmp 0x5713
movb -0xf5(%rbp), %al
testb $0x1, %al
jne 0x571f
jmp 0x5732
movq -0xe0(%rbp), %rdi
callq 0x47f0
jmp 0x572d
jmp 0x599f
leaq 0x6b2c(%rip), %rsi      # 0xc265
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0xf6(%rbp)
jmp 0x574a
movb -0xf6(%rbp), %al
testb $0x1, %al
jne 0x5756
jmp 0x5770
movq -0xe0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x4b70
jmp 0x576b
jmp 0x599d
leaq 0x6af5(%rip), %rsi      # 0xc26c
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0xf7(%rbp)
jmp 0x5788
movb -0xf7(%rbp), %al
testb $0x1, %al
jne 0x5794
jmp 0x57b3
movq -0xe0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
movq -0xc0(%rbp), %rdx
callq 0x4e30
jmp 0x599b
leaq 0x6ab9(%rip), %rsi      # 0xc273
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0xf8(%rbp)
jmp 0x57cb
movb -0xf8(%rbp), %al
testb $0x1, %al
jne 0x57d7
jmp 0x57f1
movq -0xe0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x6260
jmp 0x57ec
jmp 0x5999
leaq 0x6a7f(%rip), %rsi      # 0xc277
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0xf9(%rbp)
jmp 0x5809
movb -0xf9(%rbp), %al
testb $0x1, %al
jne 0x5818
jmp 0x58e7
callq 0x3060
movl $0x0, (%rax)
leaq -0x78(%rbp), %rdi
addq $0x40, %rdi
callq 0x3190
movq %rax, %rdi
xorl %eax, %eax
movl %eax, %esi
xorl %edx, %edx
callq 0x3130
movq %rax, -0xd0(%rbp)
callq 0x3060
movq %rax, %rcx
xorl %eax, %eax
cmpl (%rcx), %eax
jne 0x5870
movq -0xe0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
movl -0xd0(%rbp), %edx
callq 0x65f0
jmp 0x586e
jmp 0x58e2
movq 0xa779(%rip), %rdi      # 0xfff0
leaq 0x69fe(%rip), %rsi      # 0xc27c
callq 0x3340
movq %rax, -0x108(%rbp)
jmp 0x588c
movq -0x108(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3310
jmp 0x589e
movq 0xa74b(%rip), %rdi      # 0xfff0
leaq 0x69e7(%rip), %rsi      # 0xc293
callq 0x3340
movq %rax, -0x110(%rbp)
jmp 0x58ba
movq -0x110(%rbp), %rdi
movq 0xa6e0(%rip), %rsi      # 0xffa8
callq 0x3390
jmp 0x58cf
movb $0x0, -0x1(%rbp)
movl $0x1, -0xc4(%rbp)
jmp 0x59b7
jmp 0x5997
leaq 0x69c5(%rip), %rsi      # 0xc2b3
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0x111(%rbp)
jmp 0x58ff
movb -0x111(%rbp), %al
testb $0x1, %al
jne 0x590b
jmp 0x5922
movq -0xe0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x4e50
jmp 0x5920
jmp 0x5995
leaq 0x698d(%rip), %rsi      # 0xc2b6
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0x112(%rbp)
jmp 0x593a
movb -0x112(%rbp), %al
testb $0x1, %al
jne 0x5946
jmp 0x595d
movq -0xe0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x50d0
jmp 0x595b
jmp 0x5993
leaq 0x6957(%rip), %rsi      # 0xc2bb
leaq -0x78(%rbp), %rdi
callq 0x6a60
movb %al, -0x113(%rbp)
jmp 0x5975
movb -0x113(%rbp), %al
testb $0x1, %al
jne 0x5981
jmp 0x5991
movb $0x1, -0x1(%rbp)
movl $0x1, -0xc4(%rbp)
jmp 0x59b7
jmp 0x5993
jmp 0x5995
jmp 0x5997
jmp 0x5999
jmp 0x599b
jmp 0x599d
jmp 0x599f
jmp 0x59a1
jmp 0x59a3
jmp 0x59a5
jmp 0x59a7
jmp 0x59a9
movb $0x0, -0x1(%rbp)
movl $0x1, -0xc4(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x6a90
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x120, %rsp            # imm = 0x120
popq %rbp
retq
movq -0xa0(%rbp), %rdi
callq 0x3560
nopw (%rax,%rax)