blob: 1c2f38a1539e6ed42736a5f8b6ae82200f27c367 [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 Murdochb8a8cc12014-11-26 15:28:44 +000069
70// Writes the given character to the output escaping everything outside of
71// printable/space ASCII range. Additionally escapes '\' making escaping
72// reversible.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040073std::ostream& operator<<(std::ostream& os, const AsReversiblyEscapedUC16& c);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000074
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000075// Same as AsReversiblyEscapedUC16 with additional escaping of \n, \r, " and '.
76std::ostream& operator<<(std::ostream& os, const AsEscapedUC16ForJSON& c);
77
Ben Murdochb8a8cc12014-11-26 15:28:44 +000078// Writes the given character to the output escaping everything outside
79// of printable ASCII range.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040080std::ostream& operator<<(std::ostream& os, const AsUC16& c);
81
Ben Murdoch097c5b22016-05-18 11:27:45 +010082// Writes the given character to the output escaping everything outside
83// of printable ASCII range.
84std::ostream& operator<<(std::ostream& os, const AsUC32& c);
85
Emily Bernierd0a1eb72015-03-24 16:35:39 -040086} // namespace internal
87} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +000088
89#endif // V8_OSTREAMS_H_