annotate gcc/d/dmd/root/outbuffer.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 /* Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 * http://www.digitalmars.com
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 * Distributed under the Boost Software License, Version 1.0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 * (See accompanying file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 * https://github.com/D-Programming-Language/dmd/blob/master/src/root/outbuffer.c
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 #include "dsystem.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 #include "outbuffer.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 #include "object.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 char *OutBuffer::extractData()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 char *p;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 p = (char *)data;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 data = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 offset = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 size = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 return p;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 void OutBuffer::reserve(size_t nbytes)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 //printf("OutBuffer::reserve: size = %d, offset = %d, nbytes = %d\n", size, offset, nbytes);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 if (size - offset < nbytes)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 size = (offset + nbytes) * 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 size = (size + 15) & ~15;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 data = (unsigned char *)mem.xrealloc(data, size);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 void OutBuffer::reset()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 offset = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 void OutBuffer::setsize(size_t size)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 offset = size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 void OutBuffer::write(const void *data, size_t nbytes)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 if (doindent && !notlinehead)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 if (level)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 reserve(level);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 for (int i = 0; i < level; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 this->data[offset] = '\t';
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 offset++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 notlinehead = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 reserve(nbytes);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 memcpy(this->data + offset, data, nbytes);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 offset += nbytes;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 void OutBuffer::writebstring(utf8_t *string)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 write(string,*string + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 void OutBuffer::writestring(const char *string)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 write(string,strlen(string));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 void OutBuffer::prependstring(const char *string)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 size_t len = strlen(string);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 reserve(len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 memmove(data + len, data, offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 memcpy(data, string, len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 offset += len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 void OutBuffer::writenl()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 #if _WIN32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 writeword(0x0A0D); // newline is CR,LF on Microsoft OS's
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 writeByte('\n');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 if (doindent)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 notlinehead = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 void OutBuffer::writeByte(unsigned b)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 if (doindent && !notlinehead
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 && b != '\n')
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 if (level)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 reserve(level);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 for (int i = 0; i < level; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 this->data[offset] = '\t';
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 offset++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 notlinehead = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 reserve(1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 this->data[offset] = (unsigned char)b;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 offset++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 void OutBuffer::writeUTF8(unsigned b)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 reserve(6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 if (b <= 0x7F)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 this->data[offset] = (unsigned char)b;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 offset++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 else if (b <= 0x7FF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 this->data[offset + 0] = (unsigned char)((b >> 6) | 0xC0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 this->data[offset + 1] = (unsigned char)((b & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 offset += 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 else if (b <= 0xFFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 this->data[offset + 0] = (unsigned char)((b >> 12) | 0xE0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 this->data[offset + 1] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 this->data[offset + 2] = (unsigned char)((b & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 offset += 3;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 else if (b <= 0x1FFFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 this->data[offset + 0] = (unsigned char)((b >> 18) | 0xF0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 this->data[offset + 1] = (unsigned char)(((b >> 12) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 this->data[offset + 2] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 this->data[offset + 3] = (unsigned char)((b & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 offset += 4;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 else if (b <= 0x3FFFFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 this->data[offset + 0] = (unsigned char)((b >> 24) | 0xF8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 this->data[offset + 1] = (unsigned char)(((b >> 18) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 this->data[offset + 2] = (unsigned char)(((b >> 12) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 this->data[offset + 3] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 this->data[offset + 4] = (unsigned char)((b & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 offset += 5;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 else if (b <= 0x7FFFFFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 this->data[offset + 0] = (unsigned char)((b >> 30) | 0xFC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 this->data[offset + 1] = (unsigned char)(((b >> 24) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 this->data[offset + 2] = (unsigned char)(((b >> 18) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 this->data[offset + 3] = (unsigned char)(((b >> 12) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 this->data[offset + 4] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 this->data[offset + 5] = (unsigned char)((b & 0x3F) | 0x80);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 offset += 6;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 void OutBuffer::prependbyte(unsigned b)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 reserve(1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 memmove(data + 1, data, offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 data[0] = (unsigned char)b;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 offset++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 void OutBuffer::writewchar(unsigned w)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 #if _WIN32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 writeword(w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 write4(w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 void OutBuffer::writeword(unsigned w)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 #if _WIN32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 unsigned newline = 0x0A0D;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 unsigned newline = '\n';
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 if (doindent && !notlinehead
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 && w != newline)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 if (level)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 reserve(level);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 for (int i = 0; i < level; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 this->data[offset] = '\t';
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 offset++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 notlinehead = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 reserve(2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 *(unsigned short *)(this->data + offset) = (unsigned short)w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 offset += 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 void OutBuffer::writeUTF16(unsigned w)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 reserve(4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 if (w <= 0xFFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 *(unsigned short *)(this->data + offset) = (unsigned short)w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 offset += 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 else if (w <= 0x10FFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 *(unsigned short *)(this->data + offset) = (unsigned short)((w >> 10) + 0xD7C0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 *(unsigned short *)(this->data + offset + 2) = (unsigned short)((w & 0x3FF) | 0xDC00);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 offset += 4;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 void OutBuffer::write4(unsigned w)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 #if _WIN32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 bool notnewline = w != 0x000A000D;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 bool notnewline = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 if (doindent && !notlinehead && notnewline)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 if (level)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 reserve(level);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 for (int i = 0; i < level; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 this->data[offset] = '\t';
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 offset++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 notlinehead = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 reserve(4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 *(unsigned *)(this->data + offset) = w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 offset += 4;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 void OutBuffer::write(OutBuffer *buf)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 if (buf)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 { reserve(buf->offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 memcpy(data + offset, buf->data, buf->offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 offset += buf->offset;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 void OutBuffer::write(RootObject *obj)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 if (obj)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 writestring(obj->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 void OutBuffer::fill0(size_t nbytes)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 reserve(nbytes);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 memset(data + offset,0,nbytes);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 offset += nbytes;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 void OutBuffer::vprintf(const char *format, va_list args)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 int count;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 if (doindent)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 write(NULL, 0); // perform indent
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 int psize = 128;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 for (;;)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 reserve(psize);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 #if _WIN32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 count = _vsnprintf((char *)data + offset,psize,format,args);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 if (count != -1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 psize *= 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 #elif POSIX
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 va_list va;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 va_copy(va, args);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 /*
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 The functions vprintf(), vfprintf(), vsprintf(), vsnprintf()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 are equivalent to the functions printf(), fprintf(), sprintf(),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 snprintf(), respectively, except that they are called with a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 va_list instead of a variable number of arguments. These
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 functions do not call the va_end macro. Consequently, the value
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 of ap is undefined after the call. The application should call
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 va_end(ap) itself afterwards.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 count = vsnprintf((char *)data + offset,psize,format,va);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 va_end(va);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 if (count == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 psize *= 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 else if (count >= psize)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 psize = count + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 offset += count;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 void OutBuffer::printf(const char *format, ...)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 va_list ap;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 va_start(ap, format);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 vprintf(format,ap);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 va_end(ap);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 void OutBuffer::bracket(char left, char right)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 reserve(2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 memmove(data + 1, data, offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 data[0] = left;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 data[offset + 1] = right;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 offset += 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 /******************
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 * Insert left at i, and right at j.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 * Return index just past right.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 size_t OutBuffer::bracket(size_t i, const char *left, size_t j, const char *right)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 size_t leftlen = strlen(left);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 size_t rightlen = strlen(right);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 reserve(leftlen + rightlen);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 insert(i, left, leftlen);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 insert(j + leftlen, right, rightlen);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 return j + leftlen + rightlen;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 void OutBuffer::spread(size_t offset, size_t nbytes)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 reserve(nbytes);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 memmove(data + offset + nbytes, data + offset,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 this->offset - offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 this->offset += nbytes;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 /****************************************
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 * Returns: offset + nbytes
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 size_t OutBuffer::insert(size_t offset, const void *p, size_t nbytes)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 spread(offset, nbytes);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 memmove(data + offset, p, nbytes);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 return offset + nbytes;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 void OutBuffer::remove(size_t offset, size_t nbytes)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 memmove(data + offset, data + offset + nbytes, this->offset - (offset + nbytes));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 this->offset -= nbytes;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 char *OutBuffer::peekString()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 if (!offset || data[offset-1] != '\0')
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 writeByte(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 offset--; // allow appending more
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 return (char *)data;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 char *OutBuffer::extractString()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 if (!offset || data[offset-1] != '\0')
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 writeByte(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 return extractData();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 }