[Lldb-commits] [lldb] r200565 - Fixing the Windows build for the changes brought in from the iohandler merge.

Greg Clayton gclayton at apple.com
Fri Jan 31 13:41:17 PST 2014


Looks good.

On Jan 31, 2014, at 10:48 AM, Deepak Panickal <deepak at codeplay.com> wrote:

> Author: panickal
> Date: Fri Jan 31 12:48:46 2014
> New Revision: 200565
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=200565&view=rev
> Log:
> Fixing the Windows build for the changes brought in from the iohandler merge.
> 
> Added:
>    lldb/trunk/include/lldb/Host/HostGetOpt.h
>    lldb/trunk/include/lldb/Host/windows/GetOptInc.h
>    lldb/trunk/include/lldb/Host/windows/editlinewin.h
>    lldb/trunk/source/Host/windows/EditLineWin.cpp
>    lldb/trunk/source/Host/windows/GetOptInc.cpp
> Removed:
>    lldb/trunk/source/Host/windows/msvc/
>    lldb/trunk/tools/driver/ELWrapper.cpp
>    lldb/trunk/tools/driver/ELWrapper.h
>    lldb/trunk/tools/driver/GetOptWrapper.cpp
>    lldb/trunk/tools/driver/GetOptWrapper.h
> Modified:
>    lldb/trunk/CMakeLists.txt
>    lldb/trunk/include/lldb/Host/Editline.h
>    lldb/trunk/source/Commands/CommandObjectGUI.cpp
>    lldb/trunk/source/Commands/CommandObjectType.cpp
>    lldb/trunk/source/Core/IOHandler.cpp
>    lldb/trunk/source/Host/common/OptionParser.cpp
>    lldb/trunk/source/Host/windows/CMakeLists.txt
>    lldb/trunk/source/Target/Process.cpp
>    lldb/trunk/tools/driver/CMakeLists.txt
>    lldb/trunk/tools/driver/Platform.h
>    lldb/trunk/tools/lldb-platform/lldb-platform.cpp
> 
> Modified: lldb/trunk/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/CMakeLists.txt?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/CMakeLists.txt (original)
> +++ lldb/trunk/CMakeLists.txt Fri Jan 31 12:48:46 2014
> @@ -1,10 +1,14 @@
> if ( CMAKE_SYSTEM_NAME MATCHES "Windows" )
>   set(LLDB_DEFAULT_DISABLE_PYTHON 1)
> +  set(LLDB_DEFAULT_DISABLE_CURSES 1)
> else()
>   set(LLDB_DEFAULT_DISABLE_PYTHON 0)
> +  set(LLDB_DEFAULT_DISABLE_CURSES 0)
> endif()
> set(LLDB_DISABLE_PYTHON ${LLDB_DEFAULT_DISABLE_PYTHON} CACHE BOOL
>   "Disables the Python scripting integration.")
> +set(LLDB_DISABLE_CURSES ${LLDB_DEFAULT_DISABLE_CURSES} CACHE BOOL
> +  "Disables the Curses integration.")
> 
> # If we are not building as a part of LLVM, build LLDB as an
> # standalone project, using LLVM as an external library:
> @@ -77,6 +81,10 @@ if (LLDB_DISABLE_PYTHON)
>   add_definitions( -DLLDB_DISABLE_PYTHON )
> endif()
> 
> +if (LLDB_DISABLE_CURSES)
> +  add_definitions( -DLLDB_DISABLE_CURSES )
> +endif()
> +
> macro(add_lldb_definitions)
>   # We don't want no semicolons on LLDB_DEFINITIONS:
>   foreach(arg ${ARGN})
> @@ -182,7 +190,10 @@ macro(add_lldb_library name)
>   else()
>     set(libkind STATIC)
>   endif()
> -  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
> +  #PIC not needed on Win
> +  if (NOT MSVC)
> +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
> +  endif()
>   add_library(${name} ${libkind} ${srcs})
>   #if (LLVM_COMMON_DEPENDS)
>   ##add_dependencies(${name} ${LLVM_COMMON_DEPENDS})
> @@ -269,6 +280,22 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux")
>   list(APPEND system_libs ncurses panel)
> endif()
> 
> +
> +# Disable RTTI by default
> +if(NOT LLDB_REQUIRES_RTTI)
> +  if (NOT MSVC)
> +    if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR
> +        "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
> +      #gnu && clang compilers
> +      set(LLDB_COMPILE_FLAGS "-fno-rtti")
> +    endif() #GNU or CLANG
> +  else()
> +    #MSVC
> +    set(LLDB_COMPILE_FLAGS "/GR-")
> +  endif() #NOT MSVC
> +  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LLDB_COMPILE_FLAGS}")
> +endif()
> +
> #add_subdirectory(include)
> add_subdirectory(docs)
> if (NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
> 
> Modified: lldb/trunk/include/lldb/Host/Editline.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Editline.h?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Host/Editline.h (original)
> +++ lldb/trunk/include/lldb/Host/Editline.h Fri Jan 31 12:48:46 2014
> @@ -15,7 +15,7 @@
> 
> #include <stdio.h>
> #ifdef _WIN32
> -#include "ELWrapper.h"
> +#include "lldb/Host/windows/editlinewin.h"
> #else
> #include <histedit.h>
> #endif
> 
> Added: lldb/trunk/include/lldb/Host/HostGetOpt.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/HostGetOpt.h?rev=200565&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/Host/HostGetOpt.h (added)
> +++ lldb/trunk/include/lldb/Host/HostGetOpt.h Fri Jan 31 12:48:46 2014
> @@ -0,0 +1,20 @@
> +//===-- GetOpt.h ------------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +#pragma once
> +
> +#ifndef _MSC_VER
> +
> +#include <unistd.h>
> +#include <getopt.h>
> +
> +#else
> +
> +#include <lldb/Host/windows/GetOptInc.h>
> +
> +#endif
> \ No newline at end of file
> 
> Added: lldb/trunk/include/lldb/Host/windows/GetOptInc.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/windows/GetOptInc.h?rev=200565&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/Host/windows/GetOptInc.h (added)
> +++ lldb/trunk/include/lldb/Host/windows/GetOptInc.h Fri Jan 31 12:48:46 2014
> @@ -0,0 +1,46 @@
> +#pragma once
> +
> +// from getopt.h
> +#define no_argument       0
> +#define required_argument 1
> +#define optional_argument 2
> +
> +// option structure
> +struct option
> +{
> +    const char *name;
> +    // has_arg can't be an enum because some compilers complain about
> +    // type mismatches in all the code that assumes it is an int.
> +    int  has_arg;
> +    int *flag;
> +    int  val;
> +};
> +
> +int getopt( int argc, char * const argv[], const char *optstring );
> +
> +// from getopt.h
> +extern char * optarg;
> +extern int    optind;
> +extern int    opterr;
> +extern int    optopt;
> +
> +// defined in unistd.h
> +extern int    optreset;
> +
> +int getopt_long
> +(
> +    int argc,
> +    char * const *argv,
> +    const char *optstring,
> +    const struct option *longopts,
> +    int *longindex
> +);
> +
> +int getopt_long_only
> +(
> +    int argc,
> +    char * const *argv,
> +    const char *optstring,
> +    const struct option *longopts,
> +    int *longindex
> +);
> 
> Added: lldb/trunk/include/lldb/Host/windows/editlinewin.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/windows/editlinewin.h?rev=200565&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/Host/windows/editlinewin.h (added)
> +++ lldb/trunk/include/lldb/Host/windows/editlinewin.h Fri Jan 31 12:48:46 2014
> @@ -0,0 +1,123 @@
> +//===-- ELWrapper.h ---------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#pragma once
> +
> +#include <stdio.h>
> +
> +// EditLine editor function return codes.
> +// For user-defined function interface
> +#define CC_NORM         0
> +#define CC_NEWLINE      1
> +#define CC_EOF          2
> +#define CC_ARGHACK      3
> +#define CC_REFRESH      4
> +#define CC_CURSOR       5
> +#define CC_ERROR        6
> +#define CC_FATAL        7
> +#define CC_REDISPLAY    8
> +#define CC_REFRESH_BEEP 9
> +
> +// el_set/el_get parameters
> +#define EL_PROMPT        0    // , el_pfunc_t
> +#define EL_TERMINAL      1    // , const char *
> +#define EL_EDITOR        2    // , const char *
> +#define EL_SIGNAL        3    // , int);
> +#define EL_BIND          4    // , const char *, ..., NULL
> +#define EL_TELLTC        5    // , const char *, ..., NULL
> +#define EL_SETTC         6    // , const char *, ..., NULL
> +#define EL_ECHOTC        7    // , const char *, ..., NULL
> +#define EL_SETTY         8    // , const char *, ..., NULL
> +#define EL_ADDFN         9    // , const char *, const char *, el_func_t
> +#define EL_HIST          10   // , hist_fun_t, const char *
> +#define EL_EDITMODE      11   // , int
> +#define EL_RPROMPT       12   // , el_pfunc_t
> +#define EL_GETCFN        13   // , el_rfunc_t
> +#define EL_CLIENTDATA    14   // , void *
> +#define EL_UNBUFFERED    15   // , int
> +#define EL_PREP_TERM     16   // , int
> +#define EL_GETTC         17   // , const char *, ..., NULL
> +#define EL_GETFP         18   // , int, FILE **
> +#define EL_SETFP         19   // , int, FILE *
> +#define EL_REFRESH       20   // , void
> +#define EL_PROMPT_ESC	 21   // , prompt_func, Char);              set/get
> +
> +#define EL_BUILTIN_GETCFN (NULL)
> +
> +// history defines
> +#define H_FUNC           0    // , UTSL
> +#define H_SETSIZE        1    // , const int
> +#define H_GETSIZE        2    // , void
> +#define H_FIRST          3    // , void
> +#define H_LAST           4    // , void
> +#define H_PREV           5    // , void
> +#define H_NEXT           6    // , void
> +#define H_CURR           8    // , const int
> +#define H_SET            7    // , int
> +#define H_ADD            9    // , const char *
> +#define H_ENTER          10   // , const char *
> +#define H_APPEND         11   // , const char *
> +#define H_END            12   // , void
> +#define H_NEXT_STR       13   // , const char *
> +#define H_PREV_STR       14   // , const char *
> +#define H_NEXT_EVENT     15   // , const int
> +#define H_PREV_EVENT     16   // , const int
> +#define H_LOAD           17   // , const char *
> +#define H_SAVE           18   // , const char *
> +#define H_CLEAR          19   // , void
> +#define H_SETUNIQUE      20   // , int
> +#define H_GETUNIQUE      21   // , void
> +#define H_DEL            22   // , int
> +
> +struct EditLine
> +{
> +};
> +
> +struct LineInfo
> +{
> +    const char *buffer;
> +    const char *cursor;
> +    const char *lastchar;
> +};
> +
> +struct History
> +{
> +};
> +
> +struct HistEvent
> +{
> +    int         num;
> +    const char *str;
> +};
> +
> +extern "C"
> +{
> +    // edit line API
> +    EditLine        *el_init     ( const char *, FILE *, FILE *, FILE * );
> +    const char      *el_gets     ( EditLine *, int * );
> +    int              el_set      ( EditLine *, int, ... );
> +
> +    void             el_end      ( EditLine * );
> +    void             el_reset    ( EditLine * );
> +    int              el_getc     ( EditLine *, char * );
> +    void             el_push     ( EditLine *, const char * );
> +    void             el_beep     ( EditLine * );
> +    int              el_parse    ( EditLine *, int, const char ** );
> +    int              el_get      ( EditLine *, int, ... );
> +    int              el_source   ( EditLine *, const char * );
> +    void             el_resize   ( EditLine * );
> +    const LineInfo  *el_line     ( EditLine * );
> +    int              el_insertstr( EditLine *, const char * );
> +    void             el_deletestr( EditLine *, int );
> +
> +    // history API
> +    History         *history_init( void );
> +    void             history_end ( History * );
> +    int              history     ( History *, HistEvent *, int, ... );
> +};
> \ No newline at end of file
> 
> Modified: lldb/trunk/source/Commands/CommandObjectGUI.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectGUI.cpp?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/source/Commands/CommandObjectGUI.cpp (original)
> +++ lldb/trunk/source/Commands/CommandObjectGUI.cpp Fri Jan 31 12:48:46 2014
> @@ -38,6 +38,7 @@ CommandObjectGUI::~CommandObjectGUI ()
> bool
> CommandObjectGUI::DoExecute (Args& args, CommandReturnObject &result)
> {
> +#ifndef LLDB_DISABLE_CURSES
>     if (args.GetArgumentCount() == 0)
>     {
>         Debugger &debugger = m_interpreter.GetDebugger();
> @@ -52,5 +53,9 @@ CommandObjectGUI::DoExecute (Args& args,
>         result.SetStatus (eReturnStatusFailed);
>     }
>     return true;
> +#else
> +    result.AppendError("lldb was not build with gui support");
> +    return false;
> +#endif
> }
> 
> 
> Modified: lldb/trunk/source/Commands/CommandObjectType.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectType.cpp?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/source/Commands/CommandObjectType.cpp (original)
> +++ lldb/trunk/source/Commands/CommandObjectType.cpp Fri Jan 31 12:48:46 2014
> @@ -195,6 +195,7 @@ public:
>     {
>         StreamFileSP error_sp = io_handler.GetErrorStreamFile();
> 
> +#ifndef LLDB_DISABLE_PYTHON
>         ScriptInterpreter *interpreter = m_interpreter.GetScriptInterpreter();
>         if (interpreter)
>         {
> @@ -309,7 +310,7 @@ public:
>             error_sp->Printf ("error: script interpreter missing, didn't add python command.\n");
>             error_sp->Flush();
>         }
> -        
> +#endif // #ifndef LLDB_DISABLE_PYTHON
>         io_handler.SetIsDone(true);
>     }
> 
> @@ -482,6 +483,7 @@ protected:
>     {
>         StreamFileSP error_sp = io_handler.GetErrorStreamFile();
> 
> +#ifndef LLDB_DISABLE_PYTHON
>         ScriptInterpreter *interpreter = m_interpreter.GetScriptInterpreter();
>         if (interpreter)
>         {
> @@ -577,9 +579,8 @@ protected:
>             error_sp->Flush();
>         }
> 
> +#endif // #ifndef LLDB_DISABLE_PYTHON
>         io_handler.SetIsDone(true);
> -        
> -        
>     }
> 
> public:
> 
> Modified: lldb/trunk/source/Core/IOHandler.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/IOHandler.cpp?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/IOHandler.cpp (original)
> +++ lldb/trunk/source/Core/IOHandler.cpp Fri Jan 31 12:48:46 2014
> @@ -11,8 +11,10 @@
> #include "lldb/lldb-python.h"
> 
> #include <stdio.h>	/* ioctl, TIOCGWINSZ */
> -#include <sys/ioctl.h>	/* ioctl, TIOCGWINSZ */
> 
> +#ifndef _MSC_VER
> +#include <sys/ioctl.h>	/* ioctl, TIOCGWINSZ */
> +#endif
> 
> #include <string>
> 
> @@ -31,8 +33,10 @@
> #include "lldb/Target/RegisterContext.h"
> #include "lldb/Target/ThreadPlan.h"
> 
> +#ifndef LLDB_DISABLE_CURSES
> #include <ncurses.h>
> #include <panel.h>
> +#endif
> 
> using namespace lldb;
> using namespace lldb_private;
> @@ -328,9 +332,10 @@ IOHandlerEditline::IOHandlerEditline (De
> {
>     SetPrompt(prompt);
> 
> +    bool use_editline = false;
> +#ifndef _MSC_VER
>     const int in_fd = GetInputFD();
>     struct winsize window_size;
> -    bool use_editline = false;
>     if (isatty (in_fd))
>     {
>         m_interactive = true;
> @@ -340,6 +345,9 @@ IOHandlerEditline::IOHandlerEditline (De
>                 use_editline = true;
>         }
>     }
> +#else
> +    use_editline = true;
> +#endif
> 
>     if (use_editline)
>     {
> @@ -588,6 +596,10 @@ IOHandlerEditline::GotEOF()
>         m_editline_ap->Interrupt();
> }
> 
> +// we may want curses to be disabled for some builds
> +// for instance, windows
> +#ifndef LLDB_DISABLE_CURSES
> +
> #include "lldb/Core/ValueObject.h"
> #include "lldb/Symbol/VariableList.h"
> #include "lldb/Target/Target.h"
> @@ -5274,3 +5286,4 @@ IOHandlerCursesGUI::GotEOF()
> {
> }
> 
> +#endif // #ifndef LLDB_DISABLE_CURSES
> \ No newline at end of file
> 
> Modified: lldb/trunk/source/Host/common/OptionParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/OptionParser.cpp?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/common/OptionParser.cpp (original)
> +++ lldb/trunk/source/Host/common/OptionParser.cpp Fri Jan 31 12:48:46 2014
> @@ -9,14 +9,10 @@
> 
> #include "lldb/Host/OptionParser.h"
> 
> -#ifdef _MSC_VER
> -#include "../windows/msvc/getopt.inc"
> -#else
> -#ifdef _WIN32
> +#if (!defined( _MSC_VER ) && defined( _WIN32 ))
> #define _BSD_SOURCE // Required so that getopt.h defines optreset
> #endif
> -#include <getopt.h>
> -#endif
> +#include "lldb/Host/HostGetOpt.h"
> 
> using namespace lldb_private;
> 
> 
> Modified: lldb/trunk/source/Host/windows/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/CMakeLists.txt?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/windows/CMakeLists.txt (original)
> +++ lldb/trunk/source/Host/windows/CMakeLists.txt Fri Jan 31 12:48:46 2014
> @@ -6,4 +6,6 @@ add_lldb_library(lldbHostWindows
>   Mutex.cpp
>   Condition.cpp
>   Windows.cpp
> +  EditLineWin.cpp
> +  GetOptInc.cpp
>   )
> 
> Added: lldb/trunk/source/Host/windows/EditLineWin.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/EditLineWin.cpp?rev=200565&view=auto
> ==============================================================================
> --- lldb/trunk/source/Host/windows/EditLineWin.cpp (added)
> +++ lldb/trunk/source/Host/windows/EditLineWin.cpp Fri Jan 31 12:48:46 2014
> @@ -0,0 +1,422 @@
> +//===-- ELWrapper.cpp -------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +// this file is only relevant for Visual C++
> +#if defined( _MSC_VER )
> +
> +#include "lldb/Host/windows/windows.h"
> +
> +#include "lldb/Host/windows/editlinewin.h"
> +#include <vector>
> +#include <assert.h>
> +
> +// index one of the variable arguments
> +//  presuming "(EditLine *el, ..." is first in the argument list
> +#define GETARG( X ) ( (void* ) *( ( (int**) &el ) + ((X) + 2) ) )
> +
> +// edit line EL_ADDFN function pointer type
> +typedef unsigned char (*el_addfn_func)(EditLine *e, int ch);
> +
> +// edit line wrapper binding container
> +struct el_binding
> +{
> +    //
> +    const char   *name;
> +    const char   *help;
> +    // function pointer to callback routine
> +    el_addfn_func func;
> +    // ascii key this function is bound to
> +    const char   *key;
> +};
> +
> +// stored key bindings
> +static std::vector<el_binding*> _bindings;
> +
> +//TODO: this should infact be related to the exact edit line context we create
> +static void *clientData = NULL;
> +
> +// store the current prompt string
> +// default to what we expect to receive anyway
> +static const char *_prompt = "(lldb) ";
> +
> +#if !defined( _WIP_INPUT_METHOD )
> +
> +static char *
> +el_get_s (char *buffer, int chars)
> +{
> +    return gets_s(buffer, chars);
> +}
> +#else
> +
> +static void
> +con_output (char _in)
> +{
> +    HANDLE hout = GetStdHandle( STD_OUTPUT_HANDLE );
> +    DWORD written = 0;
> +    // get the cursor position
> +    CONSOLE_SCREEN_BUFFER_INFO info;
> +    GetConsoleScreenBufferInfo( hout, &info );
> +    // output this char
> +    WriteConsoleOutputCharacterA( hout, &_in, 1, info.dwCursorPosition, &written );
> +    // advance cursor position
> +    info.dwCursorPosition.X++;
> +    SetConsoleCursorPosition( hout, info.dwCursorPosition );
> +}
> +
> +static void
> +con_backspace (void)
> +{
> +    HANDLE hout = GetStdHandle( STD_OUTPUT_HANDLE );
> +    DWORD written = 0;
> +    // get cursor position
> +    CONSOLE_SCREEN_BUFFER_INFO info;
> +    GetConsoleScreenBufferInfo( hout, &info );
> +    // nudge cursor backwards
> +    info.dwCursorPosition.X--;
> +    SetConsoleCursorPosition( hout, info.dwCursorPosition );
> +    // blank out the last character
> +    WriteConsoleOutputCharacterA( hout, " ", 1, info.dwCursorPosition, &written );
> +}
> +
> +static void
> +con_return (void)
> +{
> +    HANDLE hout = GetStdHandle( STD_OUTPUT_HANDLE );
> +    DWORD written = 0;
> +    // get cursor position
> +    CONSOLE_SCREEN_BUFFER_INFO info;
> +    GetConsoleScreenBufferInfo( hout, &info );
> +    // move onto the new line
> +    info.dwCursorPosition.X = 0;
> +    info.dwCursorPosition.Y++;
> +    SetConsoleCursorPosition( hout, info.dwCursorPosition );
> +}
> +
> +static bool
> +runBind (char _key)
> +{
> +    for ( int i=0; i<_bindings.size(); i++ )
> +    {
> +        el_binding *bind = _bindings[i];
> +        if ( bind->key[0] == _key )
> +        {
> +            bind->func( (EditLine*) -1, _key );
> +            return true;
> +        }
> +    }
> +    return false;
> +}
> +
> +// replacement get_s which is EL_BIND aware
> +static char *
> +el_get_s (char *buffer, int chars)
> +{
> +    //
> +    char *head = buffer;
> +    //
> +    for ( ;; Sleep( 10 ) )
> +    {
> +        //
> +        INPUT_RECORD _record;
> +        //
> +        DWORD _read = 0;
> +        if ( ReadConsoleInputA( GetStdHandle( STD_INPUT_HANDLE ), &_record, 1, &_read ) == FALSE )
> +            break;
> +        // if we didnt read a key
> +        if ( _read == 0 )
> +            continue;
> +        // only interested in key events
> +        if ( _record.EventType != KEY_EVENT )
> +            continue;
> +        // is the key down
> +        if (! _record.Event.KeyEvent.bKeyDown )
> +            continue;
> +        // read the ascii key character
> +        char _key = _record.Event.KeyEvent.uChar.AsciiChar;
> +        // non ascii conformant key press
> +        if ( _key == 0 )
> +        {
> +            // check the scan code
> +            // if VK_UP scroll back through history
> +            // if VK_DOWN scroll forward through history
> +            continue;
> +        }
> +        // try to execute any bind this key may have
> +        if ( runBind( _key ) )
> +            continue;
> +        // if we read a return key
> +        if ( _key == '\n' || _key == '\r' )
> +        {
> +            con_return( );
> +            break;
> +        }
> +        // key is backspace
> +        if ( _key == 0x8 )
> +        {
> +            // avoid deleting past beginning
> +            if ( head > buffer )
> +            {
> +                con_backspace( );
> +                head--;
> +            }
> +            continue;
> +        }
> +
> +        // add this key to the input buffer
> +        if ( (head-buffer) < (chars-1) )
> +        {
> +            con_output( _key );
> +            *(head++) = _key;
> +        }
> +    }
> +    // insert end of line character
> +    *head = '\0';
> +
> +    return buffer;
> +}
> +#endif
> +
> +// edit line initalise
> +EditLine *
> +el_init (const char *, FILE *, FILE *, FILE *)
> +{
> +    //
> +    SetConsoleTitleA( "lldb" );
> +    // return dummy handle
> +    return (EditLine*) -1;
> +}
> +
> +const char *
> +el_gets (EditLine *el, int *length)
> +{
> +    // print the prompt if we have one
> +    if ( _prompt != NULL )
> +        printf( _prompt );
> +    // create a buffer for the user input
> +    char *buffer = new char[ MAX_PATH ];
> +    // try to get user input string
> +    if ( el_get_s( buffer, MAX_PATH ) )
> +    {
> +        // get the string length in 'length'
> +        while ( buffer[ *length ] != '\0' )
> +            (*length)++;
> +        // return the input buffer
> +        // remember that this memory has the be free'd somewhere
> +        return buffer;
> +    }
> +    else
> +    {
> +        // on error
> +        delete [] buffer;
> +        return NULL;
> +    }
> +}
> +
> +int
> +el_set (EditLine *el, int code, ...)
> +{
> +    int **arg = (int**) ⪙
> +    //
> +    switch ( code )
> +    {
> +    // edit line set prompt message
> +    case ( EL_PROMPT ):
> +        {
> +            // EL_PROMPT, char *(*f)( EditLine *)
> +            //      define a prompt printing function as 'f', which is to return a string that
> +            //      contains the prompt.
> +
> +            // get the function pointer from the arg list
> +            void *func_vp = (void*) *(arg+2);
> +            // cast to suitable prototype
> +            const char* (*func_fp)(EditLine*) = (const char*(*)(EditLine *)) func_vp;
> +            // call to get the prompt as a string
> +            _prompt = func_fp( el );
> +        }
> +        break;
> +    case ( EL_EDITOR ):
> +        {
> +            // EL_EDITOR, const char *mode
> +            //      set editing mode to "emacs" or "vi"
> +        }
> +        break;
> +    case ( EL_HIST ):
> +        {
> +            // EL_HIST, History *(*fun)(History *, int op, ... ), const char *ptr
> +            //      defines which histroy function to use, which is usualy history(). Ptr should be the
> +            //      value returned by history_init().
> +        }
> +        break;
> +    case ( EL_ADDFN ):
> +        {
> +            // EL_ADDFN, const char *name, const char *help, unsigned char (*func)(EditLine *e, int ch)
> +            //      add a user defined function, func), referred to as 'name' which is invoked when a key which is bound to 'name' is
> +            //      entered. 'help' is a description of 'name'. at involcation time, 'ch' is the key which caused the invocation. the
> +            //      return value of 'func()' should be one of:
> +            //          CC_NORM         add a normal character
> +            //          CC_NEWLINE      end of line was entered
> +            //          CC_EOF          EOF was entered
> +            //          CC_ARGHACK      expecting further command input as arguments, do nothing visually.
> +            //          CC_REFRESH      refresh display.
> +            //          CC_REFRESH_BEEP refresh display and beep.
> +            //          CC_CURSOR       cursor moved so update and perform CC_REFRESH
> +            //          CC_REDISPLAY        redisplay entire input line. this is usefull if a key binding outputs extra information.
> +            //          CC_ERROR            an error occured. beep and flush tty.
> +            //          CC_FATAL            fatal error, reset tty to known state.
> +
> +            el_binding *binding = new el_binding;
> +            binding->name = (const char *)  GETARG( 0 );
> +            binding->help = (const char *)  GETARG( 1 );
> +            binding->func = (el_addfn_func) GETARG( 2 );
> +            binding->key  = 0;
> +            // add this to the bindings list
> +            _bindings.push_back( binding );
> +        }
> +        break;
> +    case ( EL_BIND ):
> +        {
> +            // EL_BIND, const char *, ..., NULL
> +            //      perform the BIND buildin command.  Refer to editrc(5) for more information.
> +
> +            const char *name = (const char*) GETARG( 1 );
> +
> +            for ( int i=0; i<_bindings.size(); i++ )
> +            {
> +                el_binding *bind = _bindings[i];
> +                if ( strcmp( bind->name, name ) == 0 )
> +                {
> +                    bind->key = (const char *) GETARG( 0 );
> +                    break;
> +                }
> +            }
> +
> +        }
> +        break;
> +    case ( EL_CLIENTDATA ):
> +        {
> +            clientData = GETARG( 0 );
> +        }
> +        break;
> +//    default:
> +//        assert( !"Not Implemented!" );
> +    }
> +    return 0;
> +}
> +
> +void
> +el_end (EditLine *el)
> +{
> +    assert( !"Not implemented!" );
> +}
> +
> +void
> +el_reset (EditLine *)
> +{
> +    assert( !"Not implemented!" );
> +}
> +
> +int
> +el_getc (EditLine *, char *)
> +{
> +    assert( !"Not implemented!" );
> +    return 0;
> +}
> +
> +void
> +el_push (EditLine *, const char *)
> +{
> +//    assert( !"Not implemented!" );
> +}
> +
> +void
> +el_beep (EditLine *)
> +{
> +    Beep( 1000, 500 );
> +}
> +
> +int
> +el_parse (EditLine *, int, const char **)
> +{
> +    assert( !"Not implemented!" );
> +    return 0;
> +}
> +
> +int
> +el_get (EditLine *el, int code, ...)
> +{
> +    switch ( code )
> +    {
> +    case ( EL_CLIENTDATA ):
> +        {
> +            void **dout = (void**) GETARG( 0 );
> +            *dout = clientData;
> +        }
> +        break;
> +    default:
> +        assert( !"Not implemented!" );
> +    }
> +    return 0;
> +}
> +
> +int
> +el_source (EditLine *el, const char *file)
> +{
> +    // init edit line by reading the contents of 'file'
> +    // nothing to do here on windows...
> +    return 0;
> +}
> +
> +void
> +el_resize (EditLine *)
> +{
> +    assert( !"Not implemented!" );
> +}
> +
> +const LineInfo *
> +el_line (EditLine *el)
> +{
> +    assert( !"Not implemented!" );
> +    return 0;
> +}
> +
> +int
> +el_insertstr (EditLine *, const char *)
> +{
> +    assert( !"Not implemented!" );
> +    return 0;
> +}
> +
> +void
> +el_deletestr (EditLine *, int)
> +{
> +    assert( !"Not implemented!" );
> +}
> +
> +History *
> +history_init (void)
> +{
> +    // return dummy handle
> +    return (History*) -1;
> +}
> +
> +void
> +history_end (History *)
> +{
> +    assert( !"Not implemented!" );
> +}
> +
> +int
> +history (History *, HistEvent *, int op, ...)
> +{
> +    // perform operation 'op' on the history list with optional argumetns as needed by
> +    // the operation.
> +    return 0;
> +}
> +
> +#endif
> 
> Added: lldb/trunk/source/Host/windows/GetOptInc.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/GetOptInc.cpp?rev=200565&view=auto
> ==============================================================================
> --- lldb/trunk/source/Host/windows/GetOptInc.cpp (added)
> +++ lldb/trunk/source/Host/windows/GetOptInc.cpp Fri Jan 31 12:48:46 2014
> @@ -0,0 +1,469 @@
> +#include "lldb/Host/windows/GetOptInc.h"
> +
> +// getopt.cpp
> +#include <errno.h>
> +#include <stdlib.h>
> +#include <string.h>
> +
> +int opterr = 1;     /* if error message should be printed */
> +int optind = 1;     /* index into parent argv vector */
> +int optopt = '?';   /* character checked for validity */
> +int optreset;       /* reset getopt */
> +char    *optarg;    /* argument associated with option */
> +
> +#define PRINT_ERROR ((opterr) && (*options != ':'))
> +
> +#define FLAG_PERMUTE    0x01    /* permute non-options to the end of argv */
> +#define FLAG_ALLARGS    0x02    /* treat non-options as args to option "-1" */
> +#define FLAG_LONGONLY   0x04    /* operate as getopt_long_only */
> +
> +/* return values */
> +#define BADCH       (int)'?'
> +#define BADARG      ((*options == ':') ? (int)':' : (int)'?')
> +#define INORDER     (int)1
> +
> +#define EMSG        ""
> +
> +static int getopt_internal(int, char * const *, const char *,
> +    const struct option *, int *, int);
> +static int parse_long_options(char * const *, const char *,
> +    const struct option *, int *, int);
> +static int gcd(int, int);
> +static void permute_args(int, int, int, char * const *);
> +
> +static char *place = EMSG; /* option letter processing */
> +
> +/* XXX: set optreset to 1 rather than these two */
> +static int nonopt_start = -1; /* first non option argument (for permute) */
> +static int nonopt_end = -1;   /* first option after non options (for permute) */
> +
> +/* Error messages */
> +static const char recargchar[] = "option requires an argument -- %c";
> +static const char recargstring[] = "option requires an argument -- %s";
> +static const char ambig[] = "ambiguous option -- %.*s";
> +static const char noarg[] = "option doesn't take an argument -- %.*s";
> +static const char illoptchar[] = "unknown option -- %c";
> +static const char illoptstring[] = "unknown option -- %s";
> +
> +/*
> +* Compute the greatest common divisor of a and b.
> +*/
> +static int
> +gcd(int a, int b)
> +{
> +    int c;
> +
> +    c = a % b;
> +    while (c != 0) {
> +        a = b;
> +        b = c;
> +        c = a % b;
> +    }
> +
> +    return (b);
> +}
> +
> +static void pass() {}
> +#define warnx(a, ...) pass();
> +
> +/*
> +* Exchange the block from nonopt_start to nonopt_end with the block
> +* from nonopt_end to opt_end (keeping the same order of arguments
> +* in each block).
> +*/
> +static void
> +permute_args(int panonopt_start, int panonopt_end, int opt_end,
> +char * const *nargv)
> +{
> +    int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
> +    char *swap;
> +
> +    /*
> +    * compute lengths of blocks and number and size of cycles
> +    */
> +    nnonopts = panonopt_end - panonopt_start;
> +    nopts = opt_end - panonopt_end;
> +    ncycle = gcd(nnonopts, nopts);
> +    cyclelen = (opt_end - panonopt_start) / ncycle;
> +
> +    for (i = 0; i < ncycle; i++) {
> +        cstart = panonopt_end + i;
> +        pos = cstart;
> +        for (j = 0; j < cyclelen; j++) {
> +            if (pos >= panonopt_end)
> +                pos -= nnonopts;
> +            else
> +                pos += nopts;
> +            swap = nargv[pos];
> +            /* LINTED const cast */
> +            ((char **)nargv)[pos] = nargv[cstart];
> +            /* LINTED const cast */
> +            ((char **)nargv)[cstart] = swap;
> +        }
> +    }
> +}
> +
> +/*
> +* parse_long_options --
> +*  Parse long options in argc/argv argument vector.
> +* Returns -1 if short_too is set and the option does not match long_options.
> +*/
> +static int
> +parse_long_options(char * const *nargv, const char *options,
> +const struct option *long_options, int *idx, int short_too)
> +{
> +    char *current_argv, *has_equal;
> +    size_t current_argv_len;
> +    int i, match;
> +
> +    current_argv = place;
> +    match = -1;
> +
> +    optind++;
> +
> +    if ((has_equal = strchr(current_argv, '=')) != NULL) {
> +        /* argument found (--option=arg) */
> +        current_argv_len = has_equal - current_argv;
> +        has_equal++;
> +    }
> +    else
> +        current_argv_len = strlen(current_argv);
> +
> +    for (i = 0; long_options[i].name; i++) {
> +        /* find matching long option */
> +        if (strncmp(current_argv, long_options[i].name,
> +            current_argv_len))
> +            continue;
> +
> +        if (strlen(long_options[i].name) == current_argv_len) {
> +            /* exact match */
> +            match = i;
> +            break;
> +        }
> +        /*
> +        * If this is a known short option, don't allow
> +        * a partial match of a single character.
> +        */
> +        if (short_too && current_argv_len == 1)
> +            continue;
> +
> +        if (match == -1)    /* partial match */
> +            match = i;
> +        else {
> +            /* ambiguous abbreviation */
> +            if (PRINT_ERROR)
> +                warnx(ambig, (int)current_argv_len,
> +                current_argv);
> +            optopt = 0;
> +            return (BADCH);
> +        }
> +    }
> +    if (match != -1) {      /* option found */
> +        if (long_options[match].has_arg == no_argument
> +            && has_equal) {
> +            if (PRINT_ERROR)
> +                warnx(noarg, (int)current_argv_len,
> +                current_argv);
> +            /*
> +            * XXX: GNU sets optopt to val regardless of flag
> +            */
> +            if (long_options[match].flag == NULL)
> +                optopt = long_options[match].val;
> +            else
> +                optopt = 0;
> +            return (BADARG);
> +        }
> +        if (long_options[match].has_arg == required_argument ||
> +            long_options[match].has_arg == optional_argument) {
> +            if (has_equal)
> +                optarg = has_equal;
> +            else if (long_options[match].has_arg ==
> +                required_argument) {
> +                /*
> +                * optional argument doesn't use next nargv
> +                */
> +                optarg = nargv[optind++];
> +            }
> +        }
> +        if ((long_options[match].has_arg == required_argument)
> +            && (optarg == NULL)) {
> +            /*
> +            * Missing argument; leading ':' indicates no error
> +            * should be generated.
> +            */
> +            if (PRINT_ERROR)
> +                warnx(recargstring,
> +                current_argv);
> +            /*
> +            * XXX: GNU sets optopt to val regardless of flag
> +            */
> +            if (long_options[match].flag == NULL)
> +                optopt = long_options[match].val;
> +            else
> +                optopt = 0;
> +            --optind;
> +            return (BADARG);
> +        }
> +    }
> +    else {            /* unknown option */
> +        if (short_too) {
> +            --optind;
> +            return (-1);
> +        }
> +        if (PRINT_ERROR)
> +            warnx(illoptstring, current_argv);
> +        optopt = 0;
> +        return (BADCH);
> +    }
> +    if (idx)
> +        *idx = match;
> +    if (long_options[match].flag) {
> +        *long_options[match].flag = long_options[match].val;
> +        return (0);
> +    }
> +    else
> +        return (long_options[match].val);
> +}
> +
> +/*
> +* getopt_internal --
> +*  Parse argc/argv argument vector.  Called by user level routines.
> +*/
> +static int
> +getopt_internal(int nargc, char * const *nargv, const char *options,
> +const struct option *long_options, int *idx, int flags)
> +{
> +    const char *oli;                /* option letter list index */
> +    int optchar, short_too;
> +    static int posixly_correct = -1;
> +
> +    if (options == NULL)
> +        return (-1);
> +
> +    /*
> +    * XXX Some GNU programs (like cvs) set optind to 0 instead of
> +    * XXX using optreset.  Work around this braindamage.
> +    */
> +    if (optind == 0)
> +        optind = optreset = 1;
> +
> +    /*
> +    * Disable GNU extensions if POSIXLY_CORRECT is set or options
> +    * string begins with a '+'.
> +    */
> +    if (posixly_correct == -1 || optreset)
> +        posixly_correct = (getenv("POSIXLY_CORRECT") != NULL);
> +    if (*options == '-')
> +        flags |= FLAG_ALLARGS;
> +    else if (posixly_correct || *options == '+')
> +        flags &= ~FLAG_PERMUTE;
> +    if (*options == '+' || *options == '-')
> +        options++;
> +
> +    optarg = NULL;
> +    if (optreset)
> +        nonopt_start = nonopt_end = -1;
> +start:
> +    if (optreset || !*place) {      /* update scanning pointer */
> +        optreset = 0;
> +        if (optind >= nargc) {          /* end of argument vector */
> +            place = EMSG;
> +            if (nonopt_end != -1) {
> +                /* do permutation, if we have to */
> +                permute_args(nonopt_start, nonopt_end,
> +                    optind, nargv);
> +                optind -= nonopt_end - nonopt_start;
> +            }
> +            else if (nonopt_start != -1) {
> +                /*
> +                * If we skipped non-options, set optind
> +                * to the first of them.
> +                */
> +                optind = nonopt_start;
> +            }
> +            nonopt_start = nonopt_end = -1;
> +            return (-1);
> +        }
> +        if (*(place = nargv[optind]) != '-' ||
> +            (place[1] == '\0' && strchr(options, '-') == NULL)) {
> +            place = EMSG;       /* found non-option */
> +            if (flags & FLAG_ALLARGS) {
> +                /*
> +                * GNU extension:
> +                * return non-option as argument to option 1
> +                */
> +                optarg = nargv[optind++];
> +                return (INORDER);
> +            }
> +            if (!(flags & FLAG_PERMUTE)) {
> +                /*
> +                * If no permutation wanted, stop parsing
> +                * at first non-option.
> +                */
> +                return (-1);
> +            }
> +            /* do permutation */
> +            if (nonopt_start == -1)
> +                nonopt_start = optind;
> +            else if (nonopt_end != -1) {
> +                permute_args(nonopt_start, nonopt_end,
> +                    optind, nargv);
> +                nonopt_start = optind -
> +                    (nonopt_end - nonopt_start);
> +                nonopt_end = -1;
> +            }
> +            optind++;
> +            /* process next argument */
> +            goto start;
> +        }
> +        if (nonopt_start != -1 && nonopt_end == -1)
> +            nonopt_end = optind;
> +
> +        /*
> +        * If we have "-" do nothing, if "--" we are done.
> +        */
> +        if (place[1] != '\0' && *++place == '-' && place[1] == '\0') {
> +            optind++;
> +            place = EMSG;
> +            /*
> +            * We found an option (--), so if we skipped
> +            * non-options, we have to permute.
> +            */
> +            if (nonopt_end != -1) {
> +                permute_args(nonopt_start, nonopt_end,
> +                    optind, nargv);
> +                optind -= nonopt_end - nonopt_start;
> +            }
> +            nonopt_start = nonopt_end = -1;
> +            return (-1);
> +        }
> +    }
> +
> +    /*
> +    * Check long options if:
> +    *  1) we were passed some
> +    *  2) the arg is not just "-"
> +    *  3) either the arg starts with -- we are getopt_long_only()
> +    */
> +    if (long_options != NULL && place != nargv[optind] &&
> +        (*place == '-' || (flags & FLAG_LONGONLY))) {
> +        short_too = 0;
> +        if (*place == '-')
> +            place++;        /* --foo long option */
> +        else if (*place != ':' && strchr(options, *place) != NULL)
> +            short_too = 1;      /* could be short option too */
> +
> +        optchar = parse_long_options(nargv, options, long_options,
> +            idx, short_too);
> +        if (optchar != -1) {
> +            place = EMSG;
> +            return (optchar);
> +        }
> +    }
> +
> +    if ((optchar = (int)*place++) == (int)':' ||
> +        (optchar == (int)'-' && *place != '\0') ||
> +        (oli = strchr(options, optchar)) == NULL) {
> +        /*
> +        * If the user specified "-" and  '-' isn't listed in
> +        * options, return -1 (non-option) as per POSIX.
> +        * Otherwise, it is an unknown option character (or ':').
> +        */
> +        if (optchar == (int)'-' && *place == '\0')
> +            return (-1);
> +        if (!*place)
> +            ++optind;
> +        if (PRINT_ERROR)
> +            warnx(illoptchar, optchar);
> +        optopt = optchar;
> +        return (BADCH);
> +    }
> +    if (long_options != NULL && optchar == 'W' && oli[1] == ';') {
> +        /* -W long-option */
> +        if (*place)         /* no space */
> +            /* NOTHING */;
> +        else if (++optind >= nargc) {   /* no arg */
> +            place = EMSG;
> +            if (PRINT_ERROR)
> +                warnx(recargchar, optchar);
> +            optopt = optchar;
> +            return (BADARG);
> +        }
> +        else              /* white space */
> +            place = nargv[optind];
> +        optchar = parse_long_options(nargv, options, long_options,
> +            idx, 0);
> +        place = EMSG;
> +        return (optchar);
> +    }
> +    if (*++oli != ':') {            /* doesn't take argument */
> +        if (!*place)
> +            ++optind;
> +    }
> +    else {                /* takes (optional) argument */
> +        optarg = NULL;
> +        if (*place)         /* no white space */
> +            optarg = place;
> +        else if (oli[1] != ':') {   /* arg not optional */
> +            if (++optind >= nargc) {    /* no arg */
> +                place = EMSG;
> +                if (PRINT_ERROR)
> +                    warnx(recargchar, optchar);
> +                optopt = optchar;
> +                return (BADARG);
> +            }
> +            else
> +                optarg = nargv[optind];
> +        }
> +        place = EMSG;
> +        ++optind;
> +    }
> +    /* dump back option letter */
> +    return (optchar);
> +}
> +
> +/*
> +* getopt --
> +*  Parse argc/argv argument vector.
> +*
> +* [eventually this will replace the BSD getopt]
> +*/
> +int
> +getopt(int nargc, char * const *nargv, const char *options)
> +{
> +
> +    /*
> +    * We don't pass FLAG_PERMUTE to getopt_internal() since
> +    * the BSD getopt(3) (unlike GNU) has never done this.
> +    *
> +    * Furthermore, since many privileged programs call getopt()
> +    * before dropping privileges it makes sense to keep things
> +    * as simple (and bug-free) as possible.
> +    */
> +    return (getopt_internal(nargc, nargv, options, NULL, NULL, 0));
> +}
> +
> +/*
> +* getopt_long --
> +*  Parse argc/argv argument vector.
> +*/
> +int
> +getopt_long(int nargc, char * const *nargv, const char *options,
> +const struct option *long_options, int *idx)
> +{
> +    return (getopt_internal(nargc, nargv, options, long_options, idx,
> +        FLAG_PERMUTE));
> +}
> +
> +/*
> +* getopt_long_only --
> +*  Parse argc/argv argument vector.
> +*/
> +int
> +getopt_long_only(int nargc, char * const *nargv, const char *options,
> +const struct option *long_options, int *idx)
> +{
> +
> +    return (getopt_internal(nargc, nargv, options, long_options, idx,
> +        FLAG_PERMUTE | FLAG_LONGONLY));
> +}
> 
> Modified: lldb/trunk/source/Target/Process.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/source/Target/Process.cpp (original)
> +++ lldb/trunk/source/Target/Process.cpp Fri Jan 31 12:48:46 2014
> @@ -4751,7 +4751,12 @@ public:
>             return true;
> 
>         int fds[2];
> +#ifdef _MSC_VER
> +        // pipe is not supported on windows so default to a fail condition
> +        int err = 1;
> +#else
>         int err = pipe(fds);
> +#endif
>         if (err == 0)
>         {
>             m_pipe_read.SetDescriptor(fds[0], true);
> @@ -4786,6 +4791,8 @@ public:
>                 Terminal terminal(read_fd);
>                 terminal.SetCanonical(false);
>                 terminal.SetEcho(false);
> +// FD_ZERO, FD_SET are not supported on windows
> +#ifndef _MSC_VER
>                 while (!GetIsDone())
>                 {
>                     fd_set read_fdset;
> @@ -4825,6 +4832,7 @@ public:
>                         }
>                     }
>                 }
> +#endif
>                 terminal_state.Restore();
> 
>             }
> 
> Modified: lldb/trunk/tools/driver/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/CMakeLists.txt?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/tools/driver/CMakeLists.txt (original)
> +++ lldb/trunk/tools/driver/CMakeLists.txt Fri Jan 31 12:48:46 2014
> @@ -1,12 +1,7 @@
> set(LLVM_NO_RTTI 1)
> add_lldb_executable(lldb
>   Driver.cpp
> -  #DriverEvents.cpp
> -  #DriverOptions.cpp
> -  #DriverPosix.cpp
> -  ELWrapper.cpp
>   Platform.cpp
> -  GetOptWrapper.cpp
>   )
> 
> target_link_libraries(lldb liblldb)
> 
> Removed: lldb/trunk/tools/driver/ELWrapper.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/ELWrapper.cpp?rev=200564&view=auto
> ==============================================================================
> --- lldb/trunk/tools/driver/ELWrapper.cpp (original)
> +++ lldb/trunk/tools/driver/ELWrapper.cpp (removed)
> @@ -1,422 +0,0 @@
> -//===-- ELWrapper.cpp -------------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -// this file is only relevant for Visual C++
> -#if defined( _MSC_VER )
> -
> -#include "lldb/Host/windows/windows.h"
> -
> -#include "ELWrapper.h"
> -#include <vector>
> -#include <assert.h>
> -
> -// index one of the variable arguments
> -//  presuming "(EditLine *el, ..." is first in the argument list
> -#define GETARG( X ) ( (void* ) *( ( (int**) &el ) + ((X) + 2) ) )
> -
> -// edit line EL_ADDFN function pointer type
> -typedef unsigned char (*el_addfn_func)(EditLine *e, int ch);
> -
> -// edit line wrapper binding container
> -struct el_binding
> -{
> -    //
> -    const char   *name;
> -    const char   *help;
> -    // function pointer to callback routine
> -    el_addfn_func func;
> -    // ascii key this function is bound to
> -    const char   *key;
> -};
> -
> -// stored key bindings
> -static std::vector<el_binding*> _bindings;
> -
> -//TODO: this should infact be related to the exact edit line context we create
> -static void *clientData = NULL;
> -
> -// store the current prompt string
> -// default to what we expect to receive anyway
> -static const char *_prompt = "(lldb) ";
> -
> -#if !defined( _WIP_INPUT_METHOD )
> -
> -static char *
> -el_get_s (char *buffer, int chars)
> -{
> -    return gets_s(buffer, chars);
> -}
> -#else
> -
> -static void
> -con_output (char _in)
> -{
> -    HANDLE hout = GetStdHandle( STD_OUTPUT_HANDLE );
> -    DWORD written = 0;
> -    // get the cursor position
> -    CONSOLE_SCREEN_BUFFER_INFO info;
> -    GetConsoleScreenBufferInfo( hout, &info );
> -    // output this char
> -    WriteConsoleOutputCharacterA( hout, &_in, 1, info.dwCursorPosition, &written );
> -    // advance cursor position
> -    info.dwCursorPosition.X++;
> -    SetConsoleCursorPosition( hout, info.dwCursorPosition );
> -}
> -
> -static void
> -con_backspace (void)
> -{
> -    HANDLE hout = GetStdHandle( STD_OUTPUT_HANDLE );
> -    DWORD written = 0;
> -    // get cursor position
> -    CONSOLE_SCREEN_BUFFER_INFO info;
> -    GetConsoleScreenBufferInfo( hout, &info );
> -    // nudge cursor backwards
> -    info.dwCursorPosition.X--;
> -    SetConsoleCursorPosition( hout, info.dwCursorPosition );
> -    // blank out the last character
> -    WriteConsoleOutputCharacterA( hout, " ", 1, info.dwCursorPosition, &written );
> -}
> -
> -static void
> -con_return (void)
> -{
> -    HANDLE hout = GetStdHandle( STD_OUTPUT_HANDLE );
> -    DWORD written = 0;
> -    // get cursor position
> -    CONSOLE_SCREEN_BUFFER_INFO info;
> -    GetConsoleScreenBufferInfo( hout, &info );
> -    // move onto the new line
> -    info.dwCursorPosition.X = 0;
> -    info.dwCursorPosition.Y++;
> -    SetConsoleCursorPosition( hout, info.dwCursorPosition );
> -}
> -
> -static bool
> -runBind (char _key)
> -{
> -    for ( int i=0; i<_bindings.size(); i++ )
> -    {
> -        el_binding *bind = _bindings[i];
> -        if ( bind->key[0] == _key )
> -        {
> -            bind->func( (EditLine*) -1, _key );
> -            return true;
> -        }
> -    }
> -    return false;
> -}
> -
> -// replacement get_s which is EL_BIND aware
> -static char *
> -el_get_s (char *buffer, int chars)
> -{
> -    //
> -    char *head = buffer;
> -    //
> -    for ( ;; Sleep( 10 ) )
> -    {
> -        //
> -        INPUT_RECORD _record;
> -        //
> -        DWORD _read = 0;
> -        if ( ReadConsoleInputA( GetStdHandle( STD_INPUT_HANDLE ), &_record, 1, &_read ) == FALSE )
> -            break;
> -        // if we didnt read a key
> -        if ( _read == 0 )
> -            continue;
> -        // only interested in key events
> -        if ( _record.EventType != KEY_EVENT )
> -            continue;
> -        // is the key down
> -        if (! _record.Event.KeyEvent.bKeyDown )
> -            continue;
> -        // read the ascii key character
> -        char _key = _record.Event.KeyEvent.uChar.AsciiChar;
> -        // non ascii conformant key press
> -        if ( _key == 0 )
> -        {
> -            // check the scan code
> -            // if VK_UP scroll back through history
> -            // if VK_DOWN scroll forward through history
> -            continue;
> -        }
> -        // try to execute any bind this key may have
> -        if ( runBind( _key ) )
> -            continue;
> -        // if we read a return key
> -        if ( _key == '\n' || _key == '\r' )
> -        {
> -            con_return( );
> -            break;
> -        }
> -        // key is backspace
> -        if ( _key == 0x8 )
> -        {
> -            // avoid deleting past beginning
> -            if ( head > buffer )
> -            {
> -                con_backspace( );
> -                head--;
> -            }
> -            continue;
> -        }
> -
> -        // add this key to the input buffer
> -        if ( (head-buffer) < (chars-1) )
> -        {
> -            con_output( _key );
> -            *(head++) = _key;
> -        }
> -    }
> -    // insert end of line character
> -    *head = '\0';
> -
> -    return buffer;
> -}
> -#endif
> -
> -// edit line initalise
> -EditLine *
> -el_init (const char *, FILE *, FILE *, FILE *)
> -{
> -    //
> -    SetConsoleTitleA( "lldb" );
> -    // return dummy handle
> -    return (EditLine*) -1;
> -}
> -
> -const char *
> -el_gets (EditLine *el, int *length)
> -{
> -    // print the prompt if we have one
> -    if ( _prompt != NULL )
> -        printf( _prompt );
> -    // create a buffer for the user input
> -    char *buffer = new char[ MAX_PATH ];
> -    // try to get user input string
> -    if ( el_get_s( buffer, MAX_PATH ) )
> -    {
> -        // get the string length in 'length'
> -        while ( buffer[ *length ] != '\0' )
> -            (*length)++;
> -        // return the input buffer
> -        // remember that this memory has the be free'd somewhere
> -        return buffer;
> -    }
> -    else
> -    {
> -        // on error
> -        delete [] buffer;
> -        return NULL;
> -    }
> -}
> -
> -int
> -el_set (EditLine *el, int code, ...)
> -{
> -    int **arg = (int**) ⪙
> -    //
> -    switch ( code )
> -    {
> -    // edit line set prompt message
> -    case ( EL_PROMPT ):
> -        {
> -            // EL_PROMPT, char *(*f)( EditLine *)
> -            //      define a prompt printing function as 'f', which is to return a string that
> -            //      contains the prompt.
> -
> -            // get the function pointer from the arg list
> -            void *func_vp = (void*) *(arg+2);
> -            // cast to suitable prototype
> -            const char* (*func_fp)(EditLine*) = (const char*(*)(EditLine *)) func_vp;
> -            // call to get the prompt as a string
> -            _prompt = func_fp( el );
> -        }
> -        break;
> -    case ( EL_EDITOR ):
> -        {
> -            // EL_EDITOR, const char *mode
> -            //      set editing mode to "emacs" or "vi"
> -        }
> -        break;
> -    case ( EL_HIST ):
> -        {
> -            // EL_HIST, History *(*fun)(History *, int op, ... ), const char *ptr
> -            //      defines which histroy function to use, which is usualy history(). Ptr should be the
> -            //      value returned by history_init().
> -        }
> -        break;
> -    case ( EL_ADDFN ):
> -        {
> -            // EL_ADDFN, const char *name, const char *help, unsigned char (*func)(EditLine *e, int ch)
> -            //      add a user defined function, func), referred to as 'name' which is invoked when a key which is bound to 'name' is
> -            //      entered. 'help' is a description of 'name'. at involcation time, 'ch' is the key which caused the invocation. the
> -            //      return value of 'func()' should be one of:
> -            //          CC_NORM         add a normal character
> -            //          CC_NEWLINE      end of line was entered
> -            //          CC_EOF          EOF was entered
> -            //          CC_ARGHACK      expecting further command input as arguments, do nothing visually.
> -            //          CC_REFRESH      refresh display.
> -            //          CC_REFRESH_BEEP refresh display and beep.
> -            //          CC_CURSOR       cursor moved so update and perform CC_REFRESH
> -            //          CC_REDISPLAY        redisplay entire input line. this is usefull if a key binding outputs extra information.
> -            //          CC_ERROR            an error occured. beep and flush tty.
> -            //          CC_FATAL            fatal error, reset tty to known state.
> -
> -            el_binding *binding = new el_binding;
> -            binding->name = (const char *)  GETARG( 0 );
> -            binding->help = (const char *)  GETARG( 1 );
> -            binding->func = (el_addfn_func) GETARG( 2 );
> -            binding->key  = 0;
> -            // add this to the bindings list
> -            _bindings.push_back( binding );
> -        }
> -        break;
> -    case ( EL_BIND ):
> -        {
> -            // EL_BIND, const char *, ..., NULL
> -            //      perform the BIND buildin command.  Refer to editrc(5) for more information.
> -
> -            const char *name = (const char*) GETARG( 1 );
> -
> -            for ( int i=0; i<_bindings.size(); i++ )
> -            {
> -                el_binding *bind = _bindings[i];
> -                if ( strcmp( bind->name, name ) == 0 )
> -                {
> -                    bind->key = (const char *) GETARG( 0 );
> -                    break;
> -                }
> -            }
> -
> -        }
> -        break;
> -    case ( EL_CLIENTDATA ):
> -        {
> -            clientData = GETARG( 0 );
> -        }
> -        break;
> -    default:
> -        assert( !"Not Implemented!" );
> -    }
> -    return 0;
> -}
> -
> -void
> -el_end (EditLine *el)
> -{
> -    assert( !"Not implemented!" );
> -}
> -
> -void
> -el_reset (EditLine *)
> -{
> -    assert( !"Not implemented!" );
> -}
> -
> -int
> -el_getc (EditLine *, char *)
> -{
> -    assert( !"Not implemented!" );
> -    return 0;
> -}
> -
> -void
> -el_push (EditLine *, char *)
> -{
> -    assert( !"Not implemented!" );
> -}
> -
> -void
> -el_beep (EditLine *)
> -{
> -    Beep( 1000, 500 );
> -}
> -
> -int
> -el_parse (EditLine *, int, const char **)
> -{
> -    assert( !"Not implemented!" );
> -    return 0;
> -}
> -
> -int
> -el_get (EditLine *el, int code, ...)
> -{
> -    switch ( code )
> -    {
> -    case ( EL_CLIENTDATA ):
> -        {
> -            void **dout = (void**) GETARG( 0 );
> -            *dout = clientData;
> -        }
> -        break;
> -    default:
> -        assert( !"Not implemented!" );
> -    }
> -    return 0;
> -}
> -
> -int
> -el_source (EditLine *el, const char *file)
> -{
> -    // init edit line by reading the contents of 'file'
> -    // nothing to do here on windows...
> -    return 0;
> -}
> -
> -void
> -el_resize (EditLine *)
> -{
> -    assert( !"Not implemented!" );
> -}
> -
> -const LineInfo *
> -el_line (EditLine *el)
> -{
> -    assert( !"Not implemented!" );
> -    return 0;
> -}
> -
> -int
> -el_insertstr (EditLine *, const char *)
> -{
> -    assert( !"Not implemented!" );
> -    return 0;
> -}
> -
> -void
> -el_deletestr (EditLine *, int)
> -{
> -    assert( !"Not implemented!" );
> -}
> -
> -History *
> -history_init (void)
> -{
> -    // return dummy handle
> -    return (History*) -1;
> -}
> -
> -void
> -history_end (History *)
> -{
> -    assert( !"Not implemented!" );
> -}
> -
> -int
> -history (History *, HistEvent *, int op, ...)
> -{
> -    // perform operation 'op' on the history list with optional argumetns as needed by
> -    // the operation.
> -    return 0;
> -}
> -
> -#endif
> 
> Removed: lldb/trunk/tools/driver/ELWrapper.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/ELWrapper.h?rev=200564&view=auto
> ==============================================================================
> --- lldb/trunk/tools/driver/ELWrapper.h (original)
> +++ lldb/trunk/tools/driver/ELWrapper.h (removed)
> @@ -1,122 +0,0 @@
> -//===-- ELWrapper.h ---------------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#pragma once
> -
> -#include <stdio.h>
> -
> -// EditLine editor function return codes.
> -// For user-defined function interface
> -#define CC_NORM         0
> -#define CC_NEWLINE      1
> -#define CC_EOF          2
> -#define CC_ARGHACK      3
> -#define CC_REFRESH      4
> -#define CC_CURSOR       5
> -#define CC_ERROR        6
> -#define CC_FATAL        7
> -#define CC_REDISPLAY    8
> -#define CC_REFRESH_BEEP 9
> -
> -// el_set/el_get parameters
> -#define EL_PROMPT        0    // , el_pfunc_t
> -#define EL_TERMINAL      1    // , const char *
> -#define EL_EDITOR        2    // , const char *
> -#define EL_SIGNAL        3    // , int);
> -#define EL_BIND          4    // , const char *, ..., NULL
> -#define EL_TELLTC        5    // , const char *, ..., NULL
> -#define EL_SETTC         6    // , const char *, ..., NULL
> -#define EL_ECHOTC        7    // , const char *, ..., NULL
> -#define EL_SETTY         8    // , const char *, ..., NULL
> -#define EL_ADDFN         9    // , const char *, const char *, el_func_t
> -#define EL_HIST          10   // , hist_fun_t, const char *
> -#define EL_EDITMODE      11   // , int
> -#define EL_RPROMPT       12   // , el_pfunc_t
> -#define EL_GETCFN        13   // , el_rfunc_t
> -#define EL_CLIENTDATA    14   // , void *
> -#define EL_UNBUFFERED    15   // , int
> -#define EL_PREP_TERM     16   // , int
> -#define EL_GETTC         17   // , const char *, ..., NULL
> -#define EL_GETFP         18   // , int, FILE **
> -#define EL_SETFP         19   // , int, FILE *
> -#define EL_REFRESH       20   // , void
> -
> -#define EL_BUILTIN_GETCFN (NULL)
> -
> -// history defines
> -#define H_FUNC           0    // , UTSL
> -#define H_SETSIZE        1    // , const int
> -#define H_GETSIZE        2    // , void
> -#define H_FIRST          3    // , void
> -#define H_LAST           4    // , void
> -#define H_PREV           5    // , void
> -#define H_NEXT           6    // , void
> -#define H_CURR           8    // , const int
> -#define H_SET            7    // , int
> -#define H_ADD            9    // , const char *
> -#define H_ENTER          10   // , const char *
> -#define H_APPEND         11   // , const char *
> -#define H_END            12   // , void
> -#define H_NEXT_STR       13   // , const char *
> -#define H_PREV_STR       14   // , const char *
> -#define H_NEXT_EVENT     15   // , const int
> -#define H_PREV_EVENT     16   // , const int
> -#define H_LOAD           17   // , const char *
> -#define H_SAVE           18   // , const char *
> -#define H_CLEAR          19   // , void
> -#define H_SETUNIQUE      20   // , int
> -#define H_GETUNIQUE      21   // , void
> -#define H_DEL            22   // , int
> -
> -struct EditLine
> -{
> -};
> -
> -struct LineInfo
> -{
> -    const char *buffer;
> -    const char *cursor;
> -    const char *lastchar;
> -};
> -
> -struct History
> -{
> -};
> -
> -struct HistEvent
> -{
> -    int         num;
> -    const char *str;
> -};
> -
> -extern "C"
> -{
> -    // edit line API
> -    EditLine        *el_init     ( const char *, FILE *, FILE *, FILE * );
> -    const char      *el_gets     ( EditLine *, int * );
> -    int              el_set      ( EditLine *, int, ... );
> -
> -    void             el_end      ( EditLine * );
> -    void             el_reset    ( EditLine * );
> -    int              el_getc     ( EditLine *, char * );
> -    void             el_push     ( EditLine *, char * );
> -    void             el_beep     ( EditLine * );
> -    int              el_parse    ( EditLine *, int, const char ** );
> -    int              el_get      ( EditLine *, int, ... );
> -    int              el_source   ( EditLine *, const char * );
> -    void             el_resize   ( EditLine * );
> -    const LineInfo  *el_line     ( EditLine * );
> -    int              el_insertstr( EditLine *, const char * );
> -    void             el_deletestr( EditLine *, int );
> -
> -    // history API
> -    History         *history_init( void );
> -    void             history_end ( History * );
> -    int              history     ( History *, HistEvent *, int, ... );
> -};
> \ No newline at end of file
> 
> Removed: lldb/trunk/tools/driver/GetOptWrapper.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/GetOptWrapper.cpp?rev=200564&view=auto
> ==============================================================================
> --- lldb/trunk/tools/driver/GetOptWrapper.cpp (original)
> +++ lldb/trunk/tools/driver/GetOptWrapper.cpp (removed)
> @@ -1,33 +0,0 @@
> -//===-- GetOptWrapper.cpp ---------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -// this file is only relevant for Visual C++
> -#if defined( _MSC_VER )
> -
> -#include "GetOptWrapper.h"
> -
> -/*
> -
> -// already defined in lldbHostCommon.lib due to 'getopt.inc'
> -
> -extern int
> -getopt_long_only
> -(
> -    int                  ___argc,
> -    char *const         *___argv,
> -    const char          *__shortopts,
> -    const struct option *__longopts,
> -    int                 *__longind
> -)
> -{
> -    return -1;
> -}
> -*/
> -
> -#endif
> \ No newline at end of file
> 
> Removed: lldb/trunk/tools/driver/GetOptWrapper.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/GetOptWrapper.h?rev=200564&view=auto
> ==============================================================================
> --- lldb/trunk/tools/driver/GetOptWrapper.h (original)
> +++ lldb/trunk/tools/driver/GetOptWrapper.h (removed)
> @@ -1,49 +0,0 @@
> -//===-- GetOptWrapper.h -----------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef lldb_GetOptWrapper_h_
> -#define lldb_GetOptWrapper_h_
> -
> -// from getopt.h
> -#define no_argument       0
> -#define required_argument 1
> -#define optional_argument 2
> -
> -// defined int unistd.h
> -extern int   optreset;
> -
> -// from getopt.h
> -extern char *optarg;
> -extern int   optind;
> -extern int   opterr;
> -extern int   optopt;
> -
> -// option structure
> -struct option
> -{
> -    const char *name;
> -    // has_arg can't be an enum because some compilers complain about
> -    // type mismatches in all the code that assumes it is an int.
> -    int  has_arg;
> -    int *flag;
> -    int  val;
> -};
> -
> -// 
> -extern int
> -getopt_long_only
> -(
> -    int                  ___argc,
> -    char *const         *___argv,
> -    const char          *__shortopts,
> -    const struct option *__longopts,
> -    int                 *__longind
> -);
> -
> -#endif // lldb_GetOptWrapper_h_
> \ No newline at end of file
> 
> Modified: lldb/trunk/tools/driver/Platform.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/Platform.h?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/tools/driver/Platform.h (original)
> +++ lldb/trunk/tools/driver/Platform.h Fri Jan 31 12:48:46 2014
> @@ -18,9 +18,8 @@
>     #include <io.h>
>     #include <eh.h>
>     #include <inttypes.h>
> -    #include "ELWrapper.h"
>     #include "lldb/Host/windows/Windows.h"
> -    #include "GetOptWrapper.h"
> +    #include "lldb/Host/HostGetOpt.h"
> 
>     struct timeval
>     {
> 
> Modified: lldb/trunk/tools/lldb-platform/lldb-platform.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-platform/lldb-platform.cpp?rev=200565&r1=200564&r2=200565&view=diff
> ==============================================================================
> --- lldb/trunk/tools/lldb-platform/lldb-platform.cpp (original)
> +++ lldb/trunk/tools/lldb-platform/lldb-platform.cpp Fri Jan 31 12:48:46 2014
> @@ -11,7 +11,7 @@
> 
> // C Includes
> #include <errno.h>
> -#include <getopt.h>
> +#include "lldb/Host/HostGetOpt.h"
> #include <signal.h>
> #include <stdint.h>
> #include <stdio.h>
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits




More information about the lldb-commits mailing list