Home | History | Annotate | Download | only in src
      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 {
     48   explicit AsUC16(uint16_t v) : value(v) {}
     49   uint16_t value;
     50 };
     51 
     52 
     53 struct AsUC32 {
     54   explicit AsUC32(int32_t v) : value(v) {}
     55   int32_t value;
     56 };
     57 
     58 
     59 struct AsReversiblyEscapedUC16 {
     60   explicit AsReversiblyEscapedUC16(uint16_t v) : value(v) {}
     61   uint16_t value;
     62 };
     63 
     64 struct AsEscapedUC16ForJSON {
     65   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)
     71       : 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