Stream.h revision 3b924561d38937c991f9558bb23a03dc46d59734
1//===-- Stream.h ------------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_Stream_h_
11#define liblldb_Stream_h_
12#if defined(__cplusplus)
13
14#include "lldb/lldb-private.h"
15#include "lldb/Core/Flags.h"
16#include <stdarg.h>
17
18namespace lldb_private {
19
20//----------------------------------------------------------------------
21/// @class Stream Stream.h "lldb/Core/Stream.h"
22/// @brief A stream class that can stream formatted output to a file.
23//----------------------------------------------------------------------
24class Stream
25{
26public:
27    //------------------------------------------------------------------
28    /// \a m_flags bit values.
29    //------------------------------------------------------------------
30    enum
31    {
32        eVerbose    = (1 << 0), ///< If set, verbose logging is enabled
33        eDebug      = (1 << 1), ///< If set, debug logging is enabled
34        eAddPrefix  = (1 << 2), ///< Add number prefixes for binary, octal and hex when eBinary is clear
35        eBinary     = (1 << 3)  ///< Get and put data as binary instead of as the default string mode.
36    };
37
38    //------------------------------------------------------------------
39    /// Construct with flags and address size and byte order.
40    ///
41    /// Construct with dump flags \a flags and the default address
42    /// size. \a flags can be any of the above enumeration logical OR'ed
43    /// together.
44    //------------------------------------------------------------------
45    Stream (uint32_t flags,
46            uint32_t addr_size,
47            lldb::ByteOrder byte_order);
48
49    //------------------------------------------------------------------
50    /// Construct a default Stream, not binary, host byte order and
51    /// host addr size.
52    ///
53    //------------------------------------------------------------------
54    Stream ();
55
56    //------------------------------------------------------------------
57    /// Destructor
58    //------------------------------------------------------------------
59    virtual
60    ~Stream ();
61
62    //------------------------------------------------------------------
63    // Subclasses must override these methods
64    //------------------------------------------------------------------
65
66    //------------------------------------------------------------------
67    /// Flush the stream.
68    ///
69    /// Subclasses should flush the stream to make any output appear
70    /// if the stream has any buffering.
71    //------------------------------------------------------------------
72    virtual void
73    Flush () = 0;
74
75    //------------------------------------------------------------------
76    /// Output character bytes to the stream.
77    ///
78    /// Appends \a src_len characters from the buffer \a src to the
79    /// stream.
80    ///
81    /// @param[in] src
82    ///     A buffer containing at least \a src_len bytes of data.
83    ///
84    /// @param[in] src_len
85    ///     A number of bytes to append to the stream.
86    ///
87    /// @return
88    ///     The number of bytes that were appended to the stream.
89    //------------------------------------------------------------------
90    virtual int
91    Write (const void *src, size_t src_len) = 0;
92
93    //------------------------------------------------------------------
94    // Member functions
95    //------------------------------------------------------------------
96    int
97    PutChar (char ch);
98
99    //------------------------------------------------------------------
100    /// Set the byte_order value.
101    ///
102    /// Sets the byte order of the data to extract. Extracted values
103    /// will be swapped if necessary when decoding.
104    ///
105    /// @param[in] byte_order
106    ///     The byte order value to use when extracting data.
107    ///
108    /// @return
109    ///     The old byte order value.
110    //------------------------------------------------------------------
111    lldb::ByteOrder
112    SetByteOrder (lldb::ByteOrder byte_order);
113
114    //------------------------------------------------------------------
115    /// Format a C string from a printf style format and variable
116    /// arguments and encode and append the resulting C string as hex
117    /// bytes.
118    ///
119    /// @param[in] format
120    ///     A printf style format string.
121    ///
122    /// @param[in] ...
123    ///     Any additional arguments needed for the printf format string.
124    ///
125    /// @return
126    ///     The number of bytes that were appended to the stream.
127    //------------------------------------------------------------------
128    int
129    PrintfAsRawHex8 (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
130
131    //------------------------------------------------------------------
132    /// Format a C string from a printf style format and variable
133    /// arguments and encode and append the resulting C string as hex
134    /// bytes.
135    ///
136    /// @param[in] format
137    ///     A printf style format string.
138    ///
139    /// @param[in] ...
140    ///     Any additional arguments needed for the printf format string.
141    ///
142    /// @return
143    ///     The number of bytes that were appended to the stream.
144    //------------------------------------------------------------------
145    int
146    PutHex8 (uint8_t uvalue);
147
148    int
149    PutNHex8 (size_t n, uint8_t uvalue);
150
151    int
152    PutHex16 (uint16_t uvalue,
153              lldb::ByteOrder byte_order = lldb::eByteOrderInvalid);
154
155    int
156    PutHex32 (uint32_t uvalue,
157              lldb::ByteOrder byte_order = lldb::eByteOrderInvalid);
158
159    int
160    PutHex64 (uint64_t uvalue,
161              lldb::ByteOrder byte_order = lldb::eByteOrderInvalid);
162
163    int
164    PutMaxHex64 (uint64_t uvalue,
165                 size_t byte_size,
166                 lldb::ByteOrder byte_order = lldb::eByteOrderInvalid);
167    int
168    PutFloat (float f,
169              lldb::ByteOrder byte_order = lldb::eByteOrderInvalid);
170
171    int
172    PutDouble (double d,
173               lldb::ByteOrder byte_order = lldb::eByteOrderInvalid);
174
175    int
176    PutLongDouble (long double ld,
177                   lldb::ByteOrder byte_order = lldb::eByteOrderInvalid);
178
179    int
180    PutPointer (void *ptr);
181
182    // Append \a src_len bytes from \a s to the stream as hex characters
183    // (two ascii characters per byte of input data)
184    int
185    PutBytesAsRawHex8 (const void *src,
186                       size_t src_len,
187                       lldb::ByteOrder src_byte_order = lldb::eByteOrderInvalid,
188                       lldb::ByteOrder dst_byte_order = lldb::eByteOrderInvalid);
189
190    // Append \a src_len bytes from \a s to the stream as binary data.
191    int
192    PutRawBytes (const void *s,
193                 size_t src_len,
194                 lldb::ByteOrder src_byte_order = lldb::eByteOrderInvalid,
195                 lldb::ByteOrder dst_byte_order = lldb::eByteOrderInvalid);
196
197    int
198    PutCStringAsRawHex8 (const char *s);
199
200    //------------------------------------------------------------------
201    /// Output a NULL terminated C string \a cstr to the stream \a s.
202    ///
203    /// @param[in] cstr
204    ///     A NULL terminated C string.
205    ///
206    /// @return
207    ///     A reference to this class so multiple things can be streamed
208    ///     in one statement.
209    //------------------------------------------------------------------
210    Stream&
211    operator<< (const char *cstr);
212
213    //------------------------------------------------------------------
214    /// Output a pointer value \a p to the stream \a s.
215    ///
216    /// @param[in] p
217    ///     A void pointer.
218    ///
219    /// @return
220    ///     A reference to this class so multiple things can be streamed
221    ///     in one statement.
222    //------------------------------------------------------------------
223    Stream&
224    operator<< (void *p);
225
226    //------------------------------------------------------------------
227    /// Output a character \a ch to the stream \a s.
228    ///
229    /// @param[in] ch
230    ///     A printable character value.
231    ///
232    /// @return
233    ///     A reference to this class so multiple things can be streamed
234    ///     in one statement.
235    //------------------------------------------------------------------
236    Stream&
237    operator<< (char ch);
238
239    //------------------------------------------------------------------
240    /// Output a uint8_t \a uval to the stream \a s.
241    ///
242    /// @param[in] uval
243    ///     A uint8_t value.
244    ///
245    /// @return
246    ///     A reference to this class so multiple things can be streamed
247    ///     in one statement.
248    //------------------------------------------------------------------
249    Stream&
250    operator<< (uint8_t uval);
251
252    //------------------------------------------------------------------
253    /// Output a uint16_t \a uval to the stream \a s.
254    ///
255    /// @param[in] uval
256    ///     A uint16_t value.
257    ///
258    /// @return
259    ///     A reference to this class so multiple things can be streamed
260    ///     in one statement.
261    //------------------------------------------------------------------
262    Stream&
263    operator<< (uint16_t uval);
264
265    //------------------------------------------------------------------
266    /// Output a uint32_t \a uval to the stream \a s.
267    ///
268    /// @param[in] uval
269    ///     A uint32_t value.
270    ///
271    /// @return
272    ///     A reference to this class so multiple things can be streamed
273    ///     in one statement.
274    //------------------------------------------------------------------
275    Stream&
276    operator<< (uint32_t uval);
277
278    //------------------------------------------------------------------
279    /// Output a uint64_t \a uval to the stream \a s.
280    ///
281    /// @param[in] uval
282    ///     A uint64_t value.
283    ///
284    /// @return
285    ///     A reference to this class so multiple things can be streamed
286    ///     in one statement.
287    //------------------------------------------------------------------
288    Stream&
289    operator<< (uint64_t uval);
290
291    //------------------------------------------------------------------
292    /// Output a int8_t \a sval to the stream \a s.
293    ///
294    /// @param[in] sval
295    ///     A int8_t value.
296    ///
297    /// @return
298    ///     A reference to this class so multiple things can be streamed
299    ///     in one statement.
300    //------------------------------------------------------------------
301    Stream&
302    operator<< (int8_t sval);
303
304    //------------------------------------------------------------------
305    /// Output a int16_t \a sval to the stream \a s.
306    ///
307    /// @param[in] sval
308    ///     A int16_t value.
309    ///
310    /// @return
311    ///     A reference to this class so multiple things can be streamed
312    ///     in one statement.
313    //------------------------------------------------------------------
314    Stream&
315    operator<< (int16_t sval);
316
317    //------------------------------------------------------------------
318    /// Output a int32_t \a sval to the stream \a s.
319    ///
320    /// @param[in] sval
321    ///     A int32_t value.
322    ///
323    /// @return
324    ///     A reference to this class so multiple things can be streamed
325    ///     in one statement.
326    //------------------------------------------------------------------
327    Stream&
328    operator<< (int32_t sval);
329
330    //------------------------------------------------------------------
331    /// Output a int64_t \a sval to the stream \a s.
332    ///
333    /// @param[in] sval
334    ///     A int64_t value.
335    ///
336    /// @return
337    ///     A reference to this class so multiple things can be streamed
338    ///     in one statement.
339    //------------------------------------------------------------------
340    Stream&
341    operator<< (int64_t sval);
342
343    //------------------------------------------------------------------
344    /// Output an address value to this stream.
345    ///
346    /// Put an address \a addr out to the stream with optional \a prefix
347    /// and \a suffix strings.
348    ///
349    /// @param[in] addr
350    ///     An address value.
351    ///
352    /// @param[in] addr_size
353    ///     Size in bytes of the address, used for formatting.
354    ///
355    /// @param[in] prefix
356    ///     A prefix C string. If NULL, no prefix will be output.
357    ///
358    /// @param[in] suffix
359    ///     A suffix C string. If NULL, no suffix will be output.
360    //------------------------------------------------------------------
361    void
362    Address (uint64_t addr, int addr_size, const char *prefix = NULL, const char *suffix = NULL);
363
364    //------------------------------------------------------------------
365    /// Output an address range to this stream.
366    ///
367    /// Put an address range \a lo_addr - \a hi_addr out to the stream
368    /// with optional \a prefix and \a suffix strings.
369    ///
370    /// @param[in] lo_addr
371    ///     The start address of the address range.
372    ///
373    /// @param[in] hi_addr
374    ///     The end address of the address range.
375    ///
376    /// @param[in] addr_size
377    ///     Size in bytes of the address, used for formatting.
378    ///
379    /// @param[in] prefix
380    ///     A prefix C string. If NULL, no prefix will be output.
381    ///
382    /// @param[in] suffix
383    ///     A suffix C string. If NULL, no suffix will be output.
384    //------------------------------------------------------------------
385    void
386    AddressRange(uint64_t lo_addr, uint64_t hi_addr, int addr_size, const char *prefix = NULL, const char *suffix = NULL);
387
388    //------------------------------------------------------------------
389    /// Output a C string to the stream.
390    ///
391    /// Print a C string \a cstr to the stream.
392    ///
393    /// @param[in] cstr
394    ///     The string to be output to the stream.
395    //------------------------------------------------------------------
396    int
397    PutCString (const char *cstr);
398
399    //------------------------------------------------------------------
400    /// Output and End of Line character to the stream.
401    //------------------------------------------------------------------
402    int
403    EOL();
404
405    //------------------------------------------------------------------
406    /// Get the address size in bytes.
407    ///
408    /// @return
409    ///     The size of an address in bytes that is used when outputting
410    ///     address and pointer values to the stream.
411    //------------------------------------------------------------------
412    uint8_t
413    GetAddressByteSize () const;
414
415    //------------------------------------------------------------------
416    /// Test if debug logging is enabled.
417    ///
418    /// @return
419    //      \b true if the debug flag bit is set in this stream, \b
420    //      false otherwise.
421    //------------------------------------------------------------------
422    bool
423    GetDebug() const;
424
425    //------------------------------------------------------------------
426    /// The flags accessor.
427    ///
428    /// @return
429    ///     A reference to the Flags member variable.
430    //------------------------------------------------------------------
431    Flags&
432    GetFlags();
433
434    //------------------------------------------------------------------
435    /// The flags const accessor.
436    ///
437    /// @return
438    ///     A const reference to the Flags member variable.
439    //------------------------------------------------------------------
440    const Flags&
441    GetFlags() const;
442
443    //------------------------------------------------------------------
444    //// The byte order accessor.
445    ////
446    //// @return
447    ////     The byte order.
448    //------------------------------------------------------------------
449    lldb::ByteOrder
450    GetByteOrder() const;
451
452    //------------------------------------------------------------------
453    /// Get the current indentation level.
454    ///
455    /// @return
456    ///     The current indentation level as an integer.
457    //------------------------------------------------------------------
458    int
459    GetIndentLevel () const;
460
461    //------------------------------------------------------------------
462    /// Test if verbose logging is enabled.
463    ///
464    /// @return
465    //      \b true if the verbose flag bit is set in this stream, \b
466    //      false otherwise.
467    //------------------------------------------------------------------
468    bool
469    GetVerbose() const;
470
471    //------------------------------------------------------------------
472    /// Indent the current line in the stream.
473    ///
474    /// Indent the current line using the current indentation level and
475    /// print an optional string following the idenatation spaces.
476    ///
477    /// @param[in] s
478    ///     A C string to print following the indentation. If NULL, just
479    ///     output the indentation characters.
480    //------------------------------------------------------------------
481    int
482    Indent(const char *s = NULL);
483
484    //------------------------------------------------------------------
485    /// Decrement the current indentation level.
486    //------------------------------------------------------------------
487    void
488    IndentLess (int amount = 2);
489
490    //------------------------------------------------------------------
491    /// Increment the current indentation level.
492    //------------------------------------------------------------------
493    void
494    IndentMore (int amount = 2);
495
496    //------------------------------------------------------------------
497    /// Output an offset value.
498    ///
499    /// Put an offset \a uval out to the stream using the printf format
500    /// in \a format.
501    ///
502    /// @param[in] offset
503    ///     The offset value.
504    ///
505    /// @param[in] format
506    ///     The printf style format to use when outputting the offset.
507    //------------------------------------------------------------------
508    void
509    Offset (uint32_t offset, const char *format = "0x%8.8x: ");
510
511    //------------------------------------------------------------------
512    /// Output printf formatted output to the stream.
513    ///
514    /// Print some formatted output to the stream.
515    ///
516    /// @param[in] format
517    ///     A printf style format string.
518    ///
519    /// @param[in] ...
520    ///     Variable arguments that are needed for the printf style
521    ///     format string \a format.
522    //------------------------------------------------------------------
523    int
524    Printf (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
525
526    int
527    PrintfVarArg(const char *format, va_list args);
528
529    //------------------------------------------------------------------
530    /// Output a quoted C string value to the stream.
531    ///
532    /// Print a double quoted NULL terminated C string to the stream
533    /// using the printf format in \a format.
534    ///
535    /// @param[in] cstr
536    ///     A NULL terminated C string value.
537    ///
538    /// @param[in] format
539    ///     The optional C string format that can be overridden.
540    //------------------------------------------------------------------
541    void
542    QuotedCString (const char *cstr, const char *format = "\"%s\"");
543
544    //------------------------------------------------------------------
545    /// Set the address size in bytes.
546    ///
547    /// @param[in] addr_size
548    ///     The new size in bytes of an address to use when outputting
549    ///     address and pointer values.
550    //------------------------------------------------------------------
551    void
552    SetAddressByteSize (uint8_t addr_size);
553
554    //------------------------------------------------------------------
555    /// Set the current indentation level.
556    ///
557    /// @param[in] level
558    ///     The new indentation level.
559    //------------------------------------------------------------------
560    void
561    SetIndentLevel (int level);
562
563    //------------------------------------------------------------------
564    /// Output a SLEB128 number to the stream.
565    ///
566    /// Put an SLEB128 \a uval out to the stream using the printf format
567    /// in \a format.
568    ///
569    /// @param[in] uval
570    ///     A uint64_t value that was extracted as a SLEB128 value.
571    ///
572    /// @param[in] format
573    ///     The optional printf format that can be overridden.
574    //------------------------------------------------------------------
575    int
576    PutSLEB128 (int64_t uval);
577
578    //------------------------------------------------------------------
579    /// Output a ULEB128 number to the stream.
580    ///
581    /// Put an ULEB128 \a uval out to the stream using the printf format
582    /// in \a format.
583    ///
584    /// @param[in] uval
585    ///     A uint64_t value that was extracted as a ULEB128 value.
586    ///
587    /// @param[in] format
588    ///     The optional printf format that can be overridden.
589    //------------------------------------------------------------------
590    int
591    PutULEB128 (uint64_t uval);
592
593    static void
594    UnitTest(Stream *s);
595
596protected:
597    //------------------------------------------------------------------
598    // Member variables
599    //------------------------------------------------------------------
600    Flags m_flags;      ///< Dump flags.
601    uint8_t m_addr_size;    ///< Size of an address in bytes.
602    lldb::ByteOrder m_byte_order;///< Byte order to use when encoding scalar types.
603    int m_indent_level;     ///< Indention level.
604
605    int _PutHex8 (uint8_t uvalue, bool add_prefix);
606};
607
608} // namespace lldb_private
609
610#endif  // #if defined(__cplusplus)
611#endif  // liblldb_Stream_h_
612
613