blob: 56f4aa7e45b766392699c6d36e49793071f0989d [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
53struct AsReversiblyEscapedUC16 {
54 explicit AsReversiblyEscapedUC16(uint16_t v) : value(v) {}
55 uint16_t value;
56};
57
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000058struct AsEscapedUC16ForJSON {
59 explicit AsEscapedUC16ForJSON(uint16_t v) : value(v) {}
60 uint16_t value;
61};
62
Ben Murdochb8a8cc12014-11-26 15:28:44 +000063
64// Writes the given character to the output escaping everything outside of
65// printable/space ASCII range. Additionally escapes '\' making escaping
66// reversible.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040067std::ostream& operator<<(std::ostream& os, const AsReversiblyEscapedUC16& c);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000068
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000069// Same as AsReversiblyEscapedUC16 with additional escaping of \n, \r, " and '.
70std::ostream& operator<<(std::ostream& os, const AsEscapedUC16ForJSON& c);
71
Ben Murdochb8a8cc12014-11-26 15:28:44 +000072// Writes the given character to the output escaping everything outside
73// of printable ASCII range.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040074std::ostream& operator<<(std::ostream& os, const AsUC16& c);
75
76} // namespace internal
77} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +000078
79#endif // V8_OSTREAMS_H_