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 #include "src/globals.h" 17 18 namespace v8 { 19 namespace internal { 20 21 22 class OFStreamBase : public std::streambuf { 23 public: 24 explicit OFStreamBase(FILE* f); 25 virtual ~OFStreamBase(); 26 27 protected: 28 FILE* const f_; 29 30 virtual int sync(); 31 virtual int_type overflow(int_type c); 32 virtual std::streamsize xsputn(const char* s, std::streamsize n); 33 }; 34 35 36 // An output stream writing to a file. 37 class V8_EXPORT_PRIVATE OFStream : public std::ostream { 38 public: 39 explicit OFStream(FILE* f); 40 virtual ~OFStream(); 41 42 private: 43 OFStreamBase buf_; 44 }; 45 46 47 // Wrappers to disambiguate uint16_t and uc16. 48 struct AsUC16 { 49 explicit AsUC16(uint16_t v) : value(v) {} 50 uint16_t value; 51 }; 52 53 54 struct AsUC32 { 55 explicit AsUC32(int32_t v) : value(v) {} 56 int32_t value; 57 }; 58 59 60 struct AsReversiblyEscapedUC16 { 61 explicit AsReversiblyEscapedUC16(uint16_t v) : value(v) {} 62 uint16_t value; 63 }; 64 65 struct AsEscapedUC16ForJSON { 66 explicit AsEscapedUC16ForJSON(uint16_t v) : value(v) {} 67 uint16_t value; 68 }; 69 70 struct AsHex { 71 explicit AsHex(uint64_t v, uint8_t min_width = 0) 72 : value(v), min_width(min_width) {} 73 uint64_t value; 74 uint8_t min_width; 75 }; 76 77 // Writes the given character to the output escaping everything outside of 78 // printable/space ASCII range. Additionally escapes '\' making escaping 79 // reversible. 80 std::ostream& operator<<(std::ostream& os, const AsReversiblyEscapedUC16& c); 81 82 // Same as AsReversiblyEscapedUC16 with additional escaping of \n, \r, " and '. 83 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, 84 const AsEscapedUC16ForJSON& c); 85 86 // Writes the given character to the output escaping everything outside 87 // of printable ASCII range. 88 std::ostream& operator<<(std::ostream& os, const AsUC16& c); 89 90 // Writes the given character to the output escaping everything outside 91 // of printable ASCII range. 92 std::ostream& operator<<(std::ostream& os, const AsUC32& c); 93 94 // Writes the given number to the output in hexadecimal notation. 95 std::ostream& operator<<(std::ostream& os, const AsHex& v); 96 97 } // namespace internal 98 } // namespace v8 99 100 #endif // V8_OSTREAMS_H_ 101