//===-- SWIG Interface for SBStream -----------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include <stdio.h>

namespace lldb {

%feature("docstring",
"Represents a destination for streaming data output to. By default, a string
stream is created.

For example (from test/source-manager/TestSourceManager.py),

        # Create the filespec for 'main.c'.
        filespec = lldb.SBFileSpec('main.c', False)
        source_mgr = self.dbg.GetSourceManager()
        # Use a string stream as the destination.
        stream = lldb.SBStream()
        source_mgr.DisplaySourceLinesWithLineNumbers(filespec,
                                                     self.line,
                                                     2, # context before
                                                     2, # context after
                                                     '=>', # prefix for current line
                                                     stream)

        #    2    
        #    3    int main(int argc, char const *argv[]) {
        # => 4        printf('Hello world.\\n'); // Set break point at this line.
        #    5        return 0;
        #    6    }
        self.expect(stream.GetData(), 'Source code displayed correctly',
                    exe=False,
            patterns = ['=> %d.*Hello world' % self.line])
") SBStream;
class SBStream
{
public:

    SBStream ();
    
    ~SBStream ();

    bool
    IsValid() const;

    %feature("docstring", "
    //--------------------------------------------------------------------------
    /// If this stream is not redirected to a file, it will maintain a local
    /// cache for the stream data which can be accessed using this accessor.
    //--------------------------------------------------------------------------
    ") GetData;
    const char *
    GetData ();

    %feature("docstring", "
    //--------------------------------------------------------------------------
    /// If this stream is not redirected to a file, it will maintain a local
    /// cache for the stream output whose length can be accessed using this 
    /// accessor.
    //--------------------------------------------------------------------------
    ") GetSize;
    size_t
    GetSize();

    // wrapping the variadic Printf() with a plain Print()
    // because it is hard to support varargs in SWIG bridgings
    %extend {
        void Print (const char* str)
        {
            self->Printf("%s", str);
        }
    }
    
    void
    RedirectToFile (const char *path, bool append);

    void
    RedirectToFileHandle (FILE *fh, bool transfer_fh_ownership);

    void
    RedirectToFileDescriptor (int fd, bool transfer_fh_ownership);

    %feature("docstring", "
    //--------------------------------------------------------------------------
    /// If the stream is redirected to a file, forget about the file and if
    /// ownership of the file was transferred to this object, close the file.
    /// If the stream is backed by a local cache, clear this cache.
    //--------------------------------------------------------------------------
    ") Clear;
    void
    Clear ();
};

} // namespace lldb
