//===-- State.cpp -----------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Core/State.h"

using namespace lldb;
using namespace lldb_private;

const char *lldb_private::StateAsCString(StateType state) {
  switch (state) {
  case eStateInvalid:
    return "invalid";
  case eStateUnloaded:
    return "unloaded";
  case eStateConnected:
    return "connected";
  case eStateAttaching:
    return "attaching";
  case eStateLaunching:
    return "launching";
  case eStateStopped:
    return "stopped";
  case eStateRunning:
    return "running";
  case eStateStepping:
    return "stepping";
  case eStateCrashed:
    return "crashed";
  case eStateDetached:
    return "detached";
  case eStateExited:
    return "exited";
  case eStateSuspended:
    return "suspended";
  }
  return "unknown";
}

const char *lldb_private::GetPermissionsAsCString(uint32_t permissions) {
  switch (permissions) {
  case 0:
    return "---";
  case ePermissionsWritable:
    return "-w-";
  case ePermissionsReadable:
    return "r--";
  case ePermissionsExecutable:
    return "--x";
  case ePermissionsReadable | ePermissionsWritable:
    return "rw-";
  case ePermissionsReadable | ePermissionsExecutable:
    return "r-x";
  case ePermissionsWritable | ePermissionsExecutable:
    return "-wx";
  case ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable:
    return "rwx";
  default:
    break;
  }
  return "???";
}

bool lldb_private::StateIsRunningState(StateType state) {
  switch (state) {
  case eStateAttaching:
  case eStateLaunching:
  case eStateRunning:
  case eStateStepping:
    return true;

  case eStateConnected:
  case eStateDetached:
  case eStateInvalid:
  case eStateUnloaded:
  case eStateStopped:
  case eStateCrashed:
  case eStateExited:
  case eStateSuspended:
    break;
  }
  return false;
}

bool lldb_private::StateIsStoppedState(StateType state, bool must_exist) {
  switch (state) {
  case eStateInvalid:
  case eStateConnected:
  case eStateAttaching:
  case eStateLaunching:
  case eStateRunning:
  case eStateStepping:
  case eStateDetached:
    break;

  case eStateUnloaded:
  case eStateExited:
    return !must_exist;

  case eStateStopped:
  case eStateCrashed:
  case eStateSuspended:
    return true;
  }
  return false;
}
