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

/*
An example plugin for LLDB that provides a new foo command with a child subcommand
Compile this into a dylib foo.dylib and load by placing in appropriate locations on disk or
by typing plugin load foo.dylib at the LLDB command line
*/

%include_SB_APIs%

namespace lldb {
    bool
    PluginInitialize (lldb::SBDebugger debugger);
}

class ChildCommand : public lldb::SBCommandPluginInterface
{
public:
    virtual bool
    DoExecute (lldb::SBDebugger debugger,
               char** command,
               lldb::SBCommandReturnObject &result)
    {
        if (command)
        {
            const char* arg = *command;
            while (arg)
            {
                result.Printf("%s ",arg);
                arg = *(++command);
            }
            result.Printf("\n");
            return true;
        }
        return false;
    }
    
};

bool
lldb::PluginInitialize (lldb::SBDebugger debugger)
{
    lldb::SBCommandInterpreter interpreter = debugger.GetCommandInterpreter();
    lldb::SBCommand foo = interpreter.AddMultiwordCommand("plugin_loaded_command",NULL);
    foo.AddCommand("child",new ChildCommand(),"a child of plugin_loaded_command");
    return true;
}
