… | |
… | |
3 | #include <cstdio> |
3 | #include <cstdio> |
4 | |
4 | |
5 | dynbuf::dynbuf (int initial, int extend) |
5 | dynbuf::dynbuf (int initial, int extend) |
6 | { |
6 | { |
7 | _size = 0; |
7 | _size = 0; |
8 | ext = extend; |
8 | ext = extend; |
9 | first = last = (chunk *)new char [sizeof (chunk) + initial]; |
9 | first = last = (chunk *) new char[sizeof (chunk) + initial]; |
|
|
10 | |
10 | first->next = 0; |
11 | first->next = 0; |
11 | room = initial; |
12 | room = initial; |
12 | ptr = first->data; |
13 | ptr = first->data; |
13 | } |
14 | } |
14 | |
15 | |
15 | dynbuf::~dynbuf () |
16 | dynbuf::~dynbuf () |
16 | { |
17 | { |
17 | clear (); |
18 | clear (); |
18 | } |
19 | } |
19 | |
20 | |
|
|
21 | void |
20 | void dynbuf::clear () |
22 | dynbuf::clear () |
21 | { |
23 | { |
22 | while (first) |
24 | while (first) |
23 | { |
25 | { |
24 | chunk *next = first->next; |
26 | chunk *next = first->next; |
|
|
27 | |
25 | delete [] (char *)first; |
28 | delete[](char *) first; |
26 | first = next; |
29 | first = next; |
27 | } |
30 | } |
28 | } |
31 | } |
29 | |
32 | |
|
|
33 | void |
30 | void dynbuf::finish () |
34 | dynbuf::finish () |
31 | { |
35 | { |
32 | // finalise current chunk |
36 | // finalise current chunk |
33 | _size += last->size = ptr - last->data; |
37 | _size += last->size = ptr - last->data; |
34 | } |
38 | } |
35 | |
39 | |
|
|
40 | void |
36 | void dynbuf::_reserve (int size) |
41 | dynbuf::_reserve (int size) |
37 | { |
42 | { |
38 | finish (); |
43 | finish (); |
39 | |
44 | |
40 | do |
45 | do |
41 | { |
46 | { |
42 | ext += ext >> 1; |
47 | ext += ext >> 1; |
43 | ext = (ext + 15) & ~15; |
48 | ext = (ext + 15) & ~15; |
44 | } |
49 | } |
45 | while (ext < size); |
50 | while (ext < size); |
46 | |
51 | |
47 | chunk *add = (chunk *)new char [sizeof (chunk) + ext]; |
52 | chunk *add = (chunk *) new char[sizeof (chunk) + ext]; |
|
|
53 | |
48 | add->next = 0; |
54 | add->next = 0; |
49 | |
55 | |
50 | last->next = add; |
56 | last->next = add; |
51 | last = add; |
57 | last = add; |
52 | |
58 | |
53 | room = ext; |
59 | room = ext; |
54 | ptr = last->data; |
60 | ptr = last->data; |
55 | } |
61 | } |
56 | |
62 | |
|
|
63 | void |
57 | void dynbuf::linearise (void *data) |
64 | dynbuf::linearise (void *data) |
58 | { |
65 | { |
59 | char *p = (char *)data; |
66 | char *p = (char *) data; |
60 | |
67 | |
61 | last->size = ptr - last->data; |
68 | last->size = ptr - last->data; |
62 | |
69 | |
63 | for (chunk *c = first; c; c = c->next) |
70 | for (chunk * c = first; c; c = c->next) |
64 | { |
71 | { |
65 | memcpy (p, c->data, c->size); |
72 | memcpy (p, c->data, c->size); |
66 | p += c->size; |
73 | p += c->size; |
67 | } |
74 | } |
68 | } |
75 | } |
69 | |
76 | |
|
|
77 | char * |
70 | char *dynbuf::linearise () |
78 | dynbuf::linearise () |
71 | { |
79 | { |
72 | if (first->next) |
80 | if (first->next) |
73 | { |
81 | { |
74 | finish (); |
82 | finish (); |
75 | |
83 | |
76 | chunk *add = (chunk *)new char [sizeof (chunk) + _size]; |
84 | chunk *add = (chunk *) new char[sizeof (chunk) + _size]; |
77 | |
85 | |
78 | add->next = 0; |
86 | add->next = 0; |
79 | linearise ((void *)add->data); |
87 | linearise ((void *) add->data); |
80 | clear (); |
88 | clear (); |
81 | |
89 | |
82 | first = last = add; |
90 | first = last = add; |
83 | ptr = last->data + _size; |
91 | ptr = last->data + _size; |
84 | _size = 0; |
92 | _size = 0; |
85 | room = 0; |
93 | room = 0; |
86 | } |
94 | } |
87 | |
95 | |
88 | return first->data; |
96 | return first->data; |
89 | } |
97 | } |
90 | |
98 | |
|
|
99 | void |
91 | void dynbuf::add (sint32 i) |
100 | dynbuf::add (sint32 i) |
92 | { |
101 | { |
93 | char buf [max_sint32_size]; |
102 | char buf[max_sint32_size]; |
94 | char *p = buf + sizeof (buf); |
103 | char *p = buf + sizeof (buf); |
95 | char neg; |
104 | char neg; |
|
|
105 | |
|
|
106 | uint32 val; |
96 | |
107 | |
97 | if (i < 0) |
108 | if (i < 0) |
98 | { |
109 | { |
99 | neg = '-'; |
110 | neg = '-'; |
100 | i = -i; |
111 | val = -i; |
101 | } |
112 | } |
102 | else |
113 | else |
|
|
114 | { |
103 | neg = 0; |
115 | neg = 0; |
104 | |
116 | val = i; |
105 | uint32 val = i; |
117 | } |
106 | |
118 | |
107 | do |
119 | do |
108 | { |
120 | { |
109 | uint32 div = val / 10; |
121 | uint32 div = val / 10; |
110 | *--p = '0' + char (val - div * 10); |
122 | *--p = '0' + char (val - div * 10); |
|
|
123 | |
111 | val = div; |
124 | val = div; |
112 | } |
125 | } |
113 | while (val); |
126 | while (val); |
114 | |
127 | |
115 | if (neg) |
128 | if (neg) |
116 | *--p = neg; |
129 | *--p = neg; |
117 | |
130 | |
118 | add ((void *)p, buf + sizeof (buf) - p); |
131 | add ((void *) p, buf + sizeof (buf) - p); |
119 | } |
132 | } |
120 | |
133 | |
|
|
134 | void |
121 | void dynbuf::add (sint64 i) |
135 | dynbuf::add (sint64 i) |
122 | { |
136 | { |
123 | if (i > -10000000 && i < 10000000) |
137 | if (i > -10000000 && i < 10000000) |
124 | { |
138 | { |
125 | add (sint32 (i)); |
139 | add (sint32 (i)); |
126 | return; |
140 | return; |
127 | } |
141 | } |
128 | |
142 | |
|
|
143 | char buf[max_sint64_size]; |
|
|
144 | char *p = buf + sizeof (buf); |
|
|
145 | char neg; |
|
|
146 | |
|
|
147 | uint64 val; |
|
|
148 | |
129 | if (i < 0) |
149 | if (i < 0) |
130 | { |
150 | { |
131 | add ('-'); |
151 | neg = '-'; |
132 | i = -i; |
152 | val = -i; |
|
|
153 | } |
|
|
154 | else |
|
|
155 | { |
|
|
156 | neg = 0; |
|
|
157 | val = i; |
133 | } |
158 | } |
134 | |
159 | |
135 | if (i > 1000000000000000) |
160 | do |
136 | { |
161 | { |
137 | add (sint32 (i / 1000000000000000)); |
162 | uint64 div = val / 10; |
138 | i %= 1000000000000000; |
163 | *--p = '0' + char (val - div * 10); |
|
|
164 | |
|
|
165 | val = div; |
139 | } |
166 | } |
|
|
167 | while (val); |
140 | |
168 | |
141 | if (i > 10000000) |
169 | if (neg) |
142 | { |
170 | *--p = neg; |
143 | add (sint32 (i / 10000000)); |
|
|
144 | i %= 10000000; |
|
|
145 | } |
|
|
146 | |
171 | |
147 | add (sint32 (i)); |
172 | add ((void *) p, buf + sizeof (buf) - p); |
148 | } |
173 | } |
149 | |
|
|