CommandObjectSource.cpp revision 24943d2ee8bfaa7cf5893e4709143924157a5c1e
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectSource.cpp ---------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectSource.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Args.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandContext.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *k_space_characters = "\t\n\v\f\r ";
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectSource
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectSource::CommandObjectSource() :
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject ("source",
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   "Reads in debugger commands from the file <filename> and executes them.",
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   "source <filename>")
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectSource::~CommandObjectSource ()
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectSource::Execute
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args& args,
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandContext *context,
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandInterpreter *interpreter,
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandReturnObject &result
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const int argc = args.GetArgumentCount();
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (argc == 1)
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char *filename = args.GetArgumentAtIndex(0);
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool success = true;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessageWithFormat ("Executing commands in '%s'.\n", filename);
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        FileSpec cmd_file (filename);
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (cmd_file.Exists())
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            STLStringArray commands;
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            success = cmd_file.ReadFileLines (commands);
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            STLStringArray::iterator pos = commands.begin();
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Trim out any empty lines or lines that start with the comment
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // char '#'
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            while (pos != commands.end())
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bool remove_string = false;
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                size_t non_space = pos->find_first_not_of (k_space_characters);
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (non_space == std::string::npos)
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    remove_string = true; // Empty line
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if ((*pos)[non_space] == '#')
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    remove_string = true; // Comment line that starts with '#'
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (remove_string)
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    pos = commands.erase(pos);
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ++pos;
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (commands.size() > 0)
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const size_t num_commands = commands.size();
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                size_t i;
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (i = 0; i<num_commands; ++i)
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.GetOutputStream().Printf("%s %s\n", interpreter->GetPrompt(), commands[i].c_str());
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (!interpreter->HandleCommand(commands[i].c_str(), false, result))
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (i < num_commands)
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendErrorWithFormat("Aborting source of '%s' after command '%s' failed.\n", filename, commands[i].c_str());
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessFinishResult);
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    success = true;
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendErrorWithFormat ("File '%s' does not exist.\n", filename);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            success = false;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (success)
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusSuccessFinishNoResult);
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendErrorWithFormat("'%s' takes exactly one executable filename argument.\n", GetCommandName());
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus (eReturnStatusFailed);
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result.Succeeded();
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
128