ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/dynbuf.C
Revision: 1.6
Committed: Tue Dec 26 08:54:59 2006 UTC (17 years, 5 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_0
Changes since 1.5: +0 -8 lines
Log Message:
replace update_ob_speed by ->set_speed

File Contents

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