ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/dynbuf.C
(Generate patch)

Comparing deliantra/server/server/dynbuf.C (file contents):
Revision 1.16 by root, Sun Jul 1 05:00:20 2007 UTC vs.
Revision 1.17 by root, Tue Jul 10 05:51:38 2007 UTC

21 21
22#include "global.h" 22#include "global.h"
23 23
24#include <cstdio> 24#include <cstdio>
25 25
26dynbuf::dynbuf (int initial, int extend) 26void
27dynbuf::init (int initial)
27{ 28{
28 ext = extend;
29 _size = 0; 29 _size = 0;
30 30
31 first = last = (chunk *)salloc<char> (sizeof (chunk) + initial); 31 first = last = (chunk *)salloc<char> (sizeof (chunk) + initial);
32 first->alloc = sizeof (chunk) + initial; 32 first->alloc = sizeof (chunk) + initial;
33 first->next = 0; 33 first->next = 0;
34 34
35 ptr = first->data; 35 ptr = first->data;
36 end = ptr + initial; 36 end = ptr + initial;
37} 37}
38 38
39dynbuf::~dynbuf ()
40{
41 _clear ();
42}
43
44void 39void
45dynbuf::_clear () 40dynbuf::free (chunk *&chain)
46{ 41{
47 while (first) 42 while (chain)
48 { 43 {
49 chunk *next = first->next; 44 chunk *next = chain->next;
50 45
51 sfree<char> ((char *)first, first->alloc); 46 sfree<char> ((char *)chain, chain->alloc);
52 first = next; 47 chain = next;
53 } 48 }
54} 49}
55 50
56void 51void
57dynbuf::clear () 52dynbuf::clear ()
58{ 53{
59 _clear (); 54 free (first->next);
55
60 _size = 0; 56 _size = 0;
61
62 first = last = (chunk *)salloc<char> (sizeof (chunk) + ext);
63 first->alloc = sizeof (chunk) + ext;
64 first->next = 0;
65
66 ptr = first->data; 57 ptr = first->data;
67 end = ptr + ext; 58 end = ptr + first->alloc - sizeof (chunk);
68} 59}
69 60
70void 61void
71dynbuf::finish () 62dynbuf::finalise ()
72{ 63{
73 // finalise current chunk 64 // finalise current chunk
74 _size += last->size = ptr - last->data; 65 _size += last->size = ptr - last->data;
75} 66}
76 67
77void 68void
78dynbuf::_reserve (int size) 69dynbuf::reserve (int size)
79{ 70{
80 finish (); 71 finalise ();
81 72
82 do 73 do
83 { 74 {
84 ext += ext >> 1; 75 extend += extend >> 1;
85 ext = (ext + 15) & ~15; 76 extend = (extend + 15) & ~15;
86 } 77 }
87 while (ext < size); 78 while (extend < size);
88 79
89 chunk *add = (chunk *) salloc<char> (sizeof (chunk) + ext); 80 chunk *add = (chunk *) salloc<char> (sizeof (chunk) + extend);
90 add->alloc = sizeof (chunk) + ext; 81 add->alloc = sizeof (chunk) + extend;
91 add->next = 0; 82 add->next = 0;
92 83
93 last->next = add; 84 last->next = add;
94 last = add; 85 last = add;
95 86
96 ptr = last->data; 87 ptr = last->data;
97 end = ptr + ext; 88 end = ptr + extend;
98} 89}
99 90
100void 91void
101dynbuf::linearise (void *data) 92dynbuf::linearise (void *data)
102{ 93{
108 data = (void *)(((char *)data) + c->size); 99 data = (void *)(((char *)data) + c->size);
109 } 100 }
110} 101}
111 102
112char * 103char *
113dynbuf::linearise () 104dynbuf::_linearise ()
114{ 105{
115 if (first->next) 106 finalise ();
116 {
117 finish ();
118 107
119 chunk *add = (chunk *) salloc<char> (sizeof (chunk) + _size); 108 chunk *add = (chunk *) salloc<char> (sizeof (chunk) + _size);
120 add->alloc = sizeof (chunk) + _size; 109 add->alloc = sizeof (chunk) + _size;
121 add->next = 0; 110 add->next = 0;
122 111
123 linearise ((void *)add->data); 112 linearise ((void *)add->data);
124 _clear (); 113 free (first);
125 114
126 first = last = add; 115 first = last = add;
127 ptr = last->data + _size; 116 ptr = last->data + _size;
128 end = ptr; 117 end = ptr;
129 _size = 0; 118 _size = 0;
130 }
131 119
132 return first->data; 120 return first->data;
133} 121}
134 122
135dynbuf::operator std::string () 123dynbuf::operator std::string ()
288 ptr = i2a_9 (ptr, rem, true); 276 ptr = i2a_9 (ptr, rem, true);
289 } 277 }
290 } 278 }
291} 279}
292 280
281dynbuf_text::operator const char *()
282{
283 *this << '\0';
284 linearise ();
285 --ptr;
286 return first->data;
287}
288
289void
290dynbuf_text::add_abilities (const char *name, uint32 abilities)
291{
292 if (!abilities)
293 return;
294
295 *this << '(' << name;
296
297 const char *sep = ": ";
298 for (int i = 0; i < NROFATTACKS; ++i)
299 if (abilities & (1 << i))
300 {
301 *this << sep; sep = ", ";
302 *this << attacks [i];
303 }
304
305 *this << ')';
306}
307
308void
309dynbuf_text::add_paths (const char *name, uint32 paths)
310{
311 if (!paths)
312 return;
313
314 *this << '(' << name;
315
316 const char *sep = ": ";
317 for (int i = 0; i < NRSPELLPATHS; ++i)
318 if (paths & (1 << i))
319 {
320 *this << sep; sep = ", ";
321 *this << spellpathnames [i];
322 }
323
324 *this << ')';
325}
326
293#if 0 327#if 0
294struct dynbuf_test_class { 328struct dynbuf_test_class {
295 dynbuf_test_class () 329 dynbuf_test_class ()
296 { 330 {
297 sint64 s = 0; 331 sint64 s = 0;
317 351
318 exit (0); 352 exit (0);
319 } 353 }
320} dynbuf_test; 354} dynbuf_test;
321#endif 355#endif
356

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines