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

Comparing deliantra/server/server/freezethaw.C (file contents):
Revision 1.3 by root, Sat Dec 30 20:32:30 2006 UTC vs.
Revision 1.4 by root, Sun Jan 7 02:39:14 2007 UTC

20 * You should have received a copy of the GNU General Public License 20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software 21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 * Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 */ 23 */
24 24
25#include "global.h" // bug in cfperl.h, doesn't include interface_class stuff
25#include "logger.h" 26#include "logger.h"
26#include "cfperl.h" 27#include "cfperl.h"
27#include "kw_hash.h" 28#include "kw_hash.h"
28 29
29object_freezer::object_freezer () 30object_freezer::object_freezer ()
35object_freezer::~object_freezer () 36object_freezer::~object_freezer ()
36{ 37{
37 SvREFCNT_dec (av); 38 SvREFCNT_dec (av);
38} 39}
39 40
41void
40void object_freezer::put (attachable *ext) 42object_freezer::put (attachable *ext)
41{ 43{
42 ext->optimise (); 44 ext->optimise ();
43 45
44 if (ext->self) 46 if (ext->self)
45 { 47 {
50 add ((sint32)idx); 52 add ((sint32)idx);
51 add ('\n'); 53 add ('\n');
52 } 54 }
53} 55}
54 56
57bool
55bool object_freezer::save (const char *filename) 58object_freezer::save (const char *path)
56{ 59{
57 CALL_BEGIN (3); 60 CALL_BEGIN (3);
58 CALL_ARG_SV (newSVpv (filename, 0)); 61 CALL_ARG_SV (newSVpv (path, 0));
59 CALL_ARG_SV (newRV_noinc (newSVpvn ((char *)linearise (), size ()))); 62 CALL_ARG_SV (newRV_noinc (newSVpvn ((char *)linearise (), size ())));
60 CALL_ARG_SV (newRV_inc ((SV *)av)); 63 CALL_ARG_SV (newRV_inc ((SV *)av));
61 CALL_CALL ("cf::object_freezer_save", G_VOID | G_DISCARD); 64 CALL_CALL ("cf::object_freezer_save", G_VOID | G_DISCARD);
62 CALL_END; 65 CALL_END;
63} 66}
64 67
68char *
65char *object_freezer::as_string () 69object_freezer::as_string ()
66{ 70{
67 CALL_BEGIN (2); 71 CALL_BEGIN (2);
68 CALL_ARG_SV (newRV_noinc (newSVpvn ((char *)linearise (), size ()))); 72 CALL_ARG_SV (newRV_noinc (newSVpvn ((char *)linearise (), size ())));
69 CALL_ARG_SV (newRV_inc ((SV *)av)); 73 CALL_ARG_SV (newRV_inc ((SV *)av));
70 CALL_CALL ("cf::object_freezer_as_string", G_SCALAR); 74 CALL_CALL ("cf::object_freezer_as_string", G_SCALAR);
76 CALL_END; 80 CALL_END;
77 81
78 return res; 82 return res;
79} 83}
80 84
85int
81int fprintf (object_freezer &freezer, const char *format, ...) 86fprintf (object_freezer &freezer, const char *format, ...)
82{ 87{
83 va_list ap; 88 va_list ap;
84 89
85 va_start (ap, format); 90 va_start (ap, format);
86 91
90 freezer.alloc (len); 95 freezer.alloc (len);
91 96
92 va_end (ap); 97 va_end (ap);
93} 98}
94 99
100int
95int fputs (const char *s, object_freezer &freezer) 101fputs (const char *s, object_freezer &freezer)
96{ 102{
97 freezer.add (s); 103 freezer.add (s);
98} 104}
99 105
100static const char thawer_eof[] = "\n\n\n\0\0\0"; 106static const char thawer_eof[] = "\n\n\n\0\0\0";
101 107
102object_thawer::object_thawer (const char *filename) 108object_thawer::object_thawer (const char *path)
109: name (strdup (path))
103{ 110{
104 static const char eof[] = "\n\n\n\0\0\0"; 111 static const char eof[] = "\n\n\n\0\0\0";
105 112
106 av = 0; 113 av = 0;
107 text = 0; 114 text = 0;
108 line = 0; 115 line = 0;
109 116
110 if (filename) 117 if (path)
111 { 118 {
112 CALL_BEGIN (1); 119 CALL_BEGIN (1);
113 CALL_ARG_SV (newSVpv (filename, 0)); 120 CALL_ARG_SV (newSVpv (path, 0));
114 CALL_CALL ("cf::object_thawer_load", G_ARRAY); 121 CALL_CALL ("cf::object_thawer_load", G_ARRAY);
115 122
116 if (count == 2) 123 if (count == 2)
117 { 124 {
118 // second value - perl objects 125 // second value - perl objects
139 CALL_END; 146 CALL_END;
140 } 147 }
141} 148}
142 149
143object_thawer::object_thawer (const char *data, AV *perlav) 150object_thawer::object_thawer (const char *data, AV *perlav)
151: name (strdup ("(memory stream"))
144{ 152{
145 av = perlav; 153 av = perlav;
146 text = newSVpv (data, 0); 154 text = newSVpv (data, 0);
147 sv_catpv (text, thawer_eof); 155 sv_catpv (text, thawer_eof);
148 line = SvPVbyte_nolen (text); 156 line = SvPVbyte_nolen (text);
149} 157}
150 158
159void
151void object_thawer::get (attachable *obj, int oid) 160object_thawer::get (attachable *obj, int oid)
152{ 161{
153 if (!av || oid < 0) // this is actually an error of sorts 162 if (!av || oid < 0) // this is actually an error of sorts
154 return; 163 return;
155 164
156 SV **svp = av_fetch ((AV *)av, oid, 0); 165 SV **svp = av_fetch ((AV *)av, oid, 0);
204 213
205object_thawer::~object_thawer () 214object_thawer::~object_thawer ()
206{ 215{
207 if (text) SvREFCNT_dec (text); 216 if (text) SvREFCNT_dec (text);
208 if (av) SvREFCNT_dec (av); 217 if (av) SvREFCNT_dec (av);
209}
210 218
219 free ((void *)name);
220}
221
222char *
211char *fgets (char *s, int n, object_thawer &thawer) 223fgets (char *s, int n, object_thawer &thawer)
212{ 224{
213 char *p = thawer.line; 225 char *p = thawer.line;
214 char *q = s; 226 char *q = s;
215 227
216 if (!p) 228 if (!p)
231 thawer.line = p; 243 thawer.line = p;
232 244
233 return s == q ? 0 : s; 245 return s == q ? 0 : s;
234} 246}
235 247
248keyword
236keyword object_thawer::get_kv () 249object_thawer::get_kv ()
237{ 250{
238 if (!line) 251 if (!line)
239 return KW_EOF; 252 return KW_EOF;
240 253
241 for (;;) 254 for (;;)
282 else 295 else
283 return KW_ERROR; 296 return KW_ERROR;
284 } 297 }
285} 298}
286 299
300void
287void object_thawer::skip_kv (keyword kw) 301object_thawer::skip_kv (keyword kw)
288{ 302{
289 shstr ml; 303 shstr ml;
290 304
291 switch (kw) 305 switch (kw)
292 { 306 {
294 case KW_lore: get_ml (KW_endlore , ml); break; 308 case KW_lore: get_ml (KW_endlore , ml); break;
295 case KW_maplore: get_ml (KW_endmaplore, ml); break; 309 case KW_maplore: get_ml (KW_endmaplore, ml); break;
296 } 310 }
297} 311}
298 312
313void
299void object_thawer::get (shstr &sh) const 314object_thawer::get (shstr &sh) const
300{ 315{
301 if (last_value) 316 if (last_value)
302 sh = last_value; 317 sh = last_value;
303 else 318 else
304 { 319 {
305 sh = "<value missing>"; 320 sh = "<value missing>";
306 LOG (llevError, "keyword requires value: <%.320s>\n", line);//TODO: add filename 321 LOG (llevError, "keyword requires value: <%.320s>\n", line);//TODO: add filename
307 } 322 }
308} 323}
309 324
325void
310void object_thawer::get_ml (keyword kend, shstr &sh) 326object_thawer::get_ml (keyword kend, shstr &sh)
311{ 327{
312 char kw[128]; 328 char kw[128];
313 329
314 int klen = keyword_len [kend]; 330 int klen = keyword_len [kend];
315 331
347 while (*line++ != '\n') 363 while (*line++ != '\n')
348 ; 364 ;
349 } 365 }
350} 366}
351 367
368sint32
352sint32 object_thawer::get_sint32 () const 369object_thawer::get_sint32 () const
353{ 370{
354 char *p = last_value; 371 char *p = last_value;
355 372
356 if (!p) 373 if (!p)
357 return 0; 374 return 0;
375 while (*p); 392 while (*p);
376 393
377 return negate ? -val : val; 394 return negate ? -val : val;
378} 395}
379 396
397sint64
380sint64 object_thawer::get_sint64 () const 398object_thawer::get_sint64 () const
381{ 399{
382 return last_value ? atoll (last_value) : 0; 400 return last_value ? atoll (last_value) : 0;
383} 401}
384 402
403double
385double object_thawer::get_double () const 404object_thawer::get_double () const
386{ 405{
387 return last_value ? atof (last_value) : 0; 406 return last_value ? atof (last_value) : 0;
388} 407}
389 408

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines