1 
2 /* Copyright (C) 1999-2021 by The D Language Foundation, All Rights Reserved
3  * http://www.digitalmars.com
4  * Distributed under the Boost Software License, Version 1.0.
5  * http://www.boost.org/LICENSE_1_0.txt
6  * https://github.com/dlang/dmd/blob/master/src/dmd/root/outbuffer.h
7  */
8 
9 #pragma once
10 
11 #include "dsystem.h"
12 #include "dcompat.h"
13 #include "rmem.h"
14 
15 class RootObject;
16 
17 struct OutBuffer
18 {
19 private:
20     DArray<unsigned char> data;
21     size_t offset;
22     bool notlinehead;
23 public:
24 
25     int level;
26     bool doindent;
27 
OutBufferOutBuffer28     OutBuffer()
29     {
30         data = DArray<unsigned char>();
31         offset = 0;
32 
33         doindent = 0;
34         level = 0;
35         notlinehead = 0;
36     }
~OutBufferOutBuffer37     ~OutBuffer()
38     {
39         mem.xfree(data.ptr);
40     }
sliceOutBuffer41     const DArray<unsigned char> slice() const { return data; }
lengthOutBuffer42     size_t length() const { return offset; }
43     char *extractData();
44 
45     void reserve(size_t nbytes);
46     void setsize(size_t size);
47     void reset();
48     void write(const void *data, size_t nbytes);
49     void writestring(const char *string);
50     void prependstring(const char *string);
51     void writenl();                     // write newline
52     void writeByte(unsigned b);
53     void writeUTF8(unsigned b);
54     void prependbyte(unsigned b);
55     void writewchar(unsigned w);
56     void writeword(unsigned w);
57     void writeUTF16(unsigned w);
58     void write4(unsigned w);
59     void write(OutBuffer *buf);
60     void write(RootObject *obj);
61     void fill0(size_t nbytes);
62     void vprintf(const char *format, va_list args);
63     void printf(const char *format, ...);
64     void print(unsigned long long u);
65     void bracket(char left, char right);
66     size_t bracket(size_t i, const char *left, size_t j, const char *right);
67     void spread(size_t offset, size_t nbytes);
68     size_t insert(size_t offset, const void *data, size_t nbytes);
69     void remove(size_t offset, size_t nbytes);
70     // Append terminating null if necessary and get view of internal buffer
71     char *peekChars();
72     // Append terminating null if necessary and take ownership of data
73     char *extractChars();
74 };
75