• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_OSTREAMS_H_
6 #define V8_OSTREAMS_H_
7 
8 #include <cstddef>
9 #include <cstdio>
10 #include <cstring>
11 #include <ostream>  // NOLINT
12 #include <streambuf>
13 
14 #include "include/v8config.h"
15 #include "src/base/macros.h"
16 
17 namespace v8 {
18 namespace internal {
19 
20 
21 class OFStreamBase : public std::streambuf {
22  public:
23   explicit OFStreamBase(FILE* f);
24   virtual ~OFStreamBase();
25 
26  protected:
27   FILE* const f_;
28 
29   virtual int sync();
30   virtual int_type overflow(int_type c);
31   virtual std::streamsize xsputn(const char* s, std::streamsize n);
32 };
33 
34 
35 // An output stream writing to a file.
36 class OFStream : public std::ostream {
37  public:
38   explicit OFStream(FILE* f);
39   virtual ~OFStream();
40 
41  private:
42   OFStreamBase buf_;
43 };
44 
45 
46 // Wrappers to disambiguate uint16_t and uc16.
47 struct AsUC16 {
AsUC16AsUC1648   explicit AsUC16(uint16_t v) : value(v) {}
49   uint16_t value;
50 };
51 
52 
53 struct AsUC32 {
AsUC32AsUC3254   explicit AsUC32(int32_t v) : value(v) {}
55   int32_t value;
56 };
57 
58 
59 struct AsReversiblyEscapedUC16 {
AsReversiblyEscapedUC16AsReversiblyEscapedUC1660   explicit AsReversiblyEscapedUC16(uint16_t v) : value(v) {}
61   uint16_t value;
62 };
63 
64 struct AsEscapedUC16ForJSON {
AsEscapedUC16ForJSONAsEscapedUC16ForJSON65   explicit AsEscapedUC16ForJSON(uint16_t v) : value(v) {}
66   uint16_t value;
67 };
68 
69 struct AsHex {
70   explicit AsHex(uint64_t v, uint8_t min_width = 0)
valueAsHex71       : value(v), min_width(min_width) {}
72   uint64_t value;
73   uint8_t min_width;
74 };
75 
76 // Writes the given character to the output escaping everything outside of
77 // printable/space ASCII range. Additionally escapes '\' making escaping
78 // reversible.
79 std::ostream& operator<<(std::ostream& os, const AsReversiblyEscapedUC16& c);
80 
81 // Same as AsReversiblyEscapedUC16 with additional escaping of \n, \r, " and '.
82 std::ostream& operator<<(std::ostream& os, const AsEscapedUC16ForJSON& c);
83 
84 // Writes the given character to the output escaping everything outside
85 // of printable ASCII range.
86 std::ostream& operator<<(std::ostream& os, const AsUC16& c);
87 
88 // Writes the given character to the output escaping everything outside
89 // of printable ASCII range.
90 std::ostream& operator<<(std::ostream& os, const AsUC32& c);
91 
92 // Writes the given number to the output in hexadecimal notation.
93 std::ostream& operator<<(std::ostream& os, const AsHex& v);
94 
95 }  // namespace internal
96 }  // namespace v8
97 
98 #endif  // V8_OSTREAMS_H_
99