15cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen//===-- SWIG Interface for SBStream -----------------------------*- C++ -*-===//
25cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen//
35cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen//                     The LLVM Compiler Infrastructure
45cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen//
55cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen// This file is distributed under the University of Illinois Open Source
65cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen// License. See LICENSE.TXT for details.
75cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen//
85cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen//===----------------------------------------------------------------------===//
95cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
105cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen#include <stdio.h>
115cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
125cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chennamespace lldb {
135cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
141a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen%feature("docstring",
151a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen"Represents a destination for streaming data output to. By default, a string
161a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chenstream is created.
171a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen
181a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny ChenFor example (from test/source-manager/TestSourceManager.py),
191a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen
201a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        # Create the filespec for 'main.c'.
211a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        filespec = lldb.SBFileSpec('main.c', False)
221a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        source_mgr = self.dbg.GetSourceManager()
231a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        # Use a string stream as the destination.
241a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        stream = lldb.SBStream()
251a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        source_mgr.DisplaySourceLinesWithLineNumbers(filespec,
261a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen                                                     self.line,
271a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen                                                     2, # context before
281a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen                                                     2, # context after
291a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen                                                     '=>', # prefix for current line
301a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen                                                     stream)
311a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen
321a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        #    2
331a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        #    3    int main(int argc, char const *argv[]) {
341a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        # => 4        printf('Hello world.\\n'); // Set break point at this line.
351a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        #    5        return 0;
361a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        #    6    }
371a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen        self.expect(stream.GetData(), 'Source code displayed correctly',
381a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen                    exe=False,
391a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen            patterns = ['=> %d.*Hello world' % self.line])
401a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen") SBStream;
415cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chenclass SBStream
425cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen{
435cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chenpublic:
445cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
455cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    SBStream ();
465cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
475cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    ~SBStream ();
485cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
495cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    bool
505cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    IsValid() const;
515cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
521a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    %feature("docstring", "
531a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    //--------------------------------------------------------------------------
541a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    /// If this stream is not redirected to a file, it will maintain a local
551a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    /// cache for the stream data which can be accessed using this accessor.
561a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    //--------------------------------------------------------------------------
571a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    ") GetData;
585cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    const char *
595cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    GetData ();
605cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
611a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    %feature("docstring", "
621a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    //--------------------------------------------------------------------------
631a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    /// If this stream is not redirected to a file, it will maintain a local
641a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    /// cache for the stream output whose length can be accessed using this
651a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    /// accessor.
661a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    //--------------------------------------------------------------------------
671a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    ") GetSize;
685cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    size_t
695cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    GetSize();
705cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
71edc4132cdc042e773b6ba55fbd39ea52e670158dEnrico Granata    // wrapping the variadic Printf() with a plain Print()
72edc4132cdc042e773b6ba55fbd39ea52e670158dEnrico Granata    // because it is hard to support varargs in SWIG bridgings
73edc4132cdc042e773b6ba55fbd39ea52e670158dEnrico Granata    %extend {
74edc4132cdc042e773b6ba55fbd39ea52e670158dEnrico Granata        void Print (const char* str)
75edc4132cdc042e773b6ba55fbd39ea52e670158dEnrico Granata        {
76f817d45b0db18e72797faec359454eeeba04f076Greg Clayton            self->Printf("%s", str);
77edc4132cdc042e773b6ba55fbd39ea52e670158dEnrico Granata        }
78edc4132cdc042e773b6ba55fbd39ea52e670158dEnrico Granata    }
79edc4132cdc042e773b6ba55fbd39ea52e670158dEnrico Granata
805cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    void
815cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    RedirectToFile (const char *path, bool append);
825cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
835cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    void
845cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    RedirectToFileHandle (FILE *fh, bool transfer_fh_ownership);
855cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
865cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    void
875cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    RedirectToFileDescriptor (int fd, bool transfer_fh_ownership);
885cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
891a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    %feature("docstring", "
901a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    //--------------------------------------------------------------------------
911a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    /// If the stream is redirected to a file, forget about the file and if
921a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    /// ownership of the file was transfered to this object, close the file.
931a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    /// If the stream is backed by a local cache, clear this cache.
941a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    //--------------------------------------------------------------------------
951a73d4c5ea7395971a82bc6389b0dde5db60ed2fJohnny Chen    ") Clear;
965cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    void
975cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen    Clear ();
985cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen};
995cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen
1005cb6cab6395a896ec5938acc0885858b8e2ba2c8Johnny Chen} // namespace lldb
101