blob: 977b5c6f4a48cbeda0e0163b678917779afeeac2 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
Emily Bernierd0a1eb72015-03-24 16:35:39 -04008#include <cstddef>
9#include <cstdio>
10#include <cstring>
11#include <ostream> // NOLINT
12#include <streambuf>
Ben Murdochb8a8cc12014-11-26 15:28:44 +000013
14#include "include/v8config.h"
15#include "src/base/macros.h"
16
17namespace v8 {
18namespace internal {
19
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000020
Emily Bernierd0a1eb72015-03-24 16:35:39 -040021class OFStreamBase : public std::streambuf {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000022 public:
Emily Bernierd0a1eb72015-03-24 16:35:39 -040023 explicit OFStreamBase(FILE* f);
24 virtual ~OFStreamBase();
Ben Murdochb8a8cc12014-11-26 15:28:44 +000025
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000026 protected:
Ben Murdochb8a8cc12014-11-26 15:28:44 +000027 FILE* const f_;
28
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000029 virtual int sync();
30 virtual int_type overflow(int_type c);
31 virtual std::streamsize xsputn(const char* s, std::streamsize n);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040032};
33
34
35// An output stream writing to a file.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036class OFStream : public std::ostream {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040037 public:
38 explicit OFStream(FILE* f);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000039 virtual ~OFStream();
Emily Bernierd0a1eb72015-03-24 16:35:39 -040040
41 private:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000042 OFStreamBase buf_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000043};
44
45
46// Wrappers to disambiguate uint16_t and uc16.
47struct AsUC16 {
48 explicit AsUC16(uint16_t v) : value(v) {}
49 uint16_t value;
50};
51
52
Ben Murdoch097c5b22016-05-18 11:27:45 +010053struct AsUC32 {
54 explicit AsUC32(int32_t v) : value(v) {}
55 int32_t value;
56};
57
58
Ben Murdochb8a8cc12014-11-26 15:28:44 +000059struct AsReversiblyEscapedUC16 {
60 explicit AsReversiblyEscapedUC16(uint16_t v) : value(v) {}
61 uint16_t value;
62};
63
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000064struct AsEscapedUC16ForJSON {
65 explicit AsEscapedUC16ForJSON(uint16_t v) : value(v) {}
66 uint16_t value;
67};
68
Ben Murdoch61f157c2016-09-16 13:49:30 +010069struct 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};
Ben Murdochb8a8cc12014-11-26 15:28:44 +000075
76// Writes the given character to the output escaping everything outside of
77// printable/space ASCII range. Additionally escapes '\' making escaping
78// reversible.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040079std::ostream& operator<<(std::ostream& os, const AsReversiblyEscapedUC16& c);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000080
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000081// Same as AsReversiblyEscapedUC16 with additional escaping of \n, \r, " and '.
82std::ostream& operator<<(std::ostream& os, const AsEscapedUC16ForJSON& c);
83
Ben Murdochb8a8cc12014-11-26 15:28:44 +000084// Writes the given character to the output escaping everything outside
85// of printable ASCII range.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040086std::ostream& operator<<(std::ostream& os, const AsUC16& c);
87
Ben Murdoch097c5b22016-05-18 11:27:45 +010088// Writes the given character to the output escaping everything outside
89// of printable ASCII range.
90std::ostream& operator<<(std::ostream& os, const AsUC32& c);
91
Ben Murdoch61f157c2016-09-16 13:49:30 +010092// Writes the given number to the output in hexadecimal notation.
93std::ostream& operator<<(std::ostream& os, const AsHex& v);
94
Emily Bernierd0a1eb72015-03-24 16:35:39 -040095} // namespace internal
96} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +000097
98#endif // V8_OSTREAMS_H_