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.2 by elmex, Sat Dec 30 14:34:10 2006 UTC vs.
Revision 1.5 by root, Tue Jan 9 21:32:42 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);
71 75
72 STRLEN len;
73
74 char *res = count > 0 76 char *res = count > 0
75 ? strdup (SvPVx (POPs, len)) 77 ? strdup (SvPVX (POPs))
76 : strdup ("[fatal error]"); 78 : strdup ("[fatal error]");
77 79
78 CALL_END; 80 CALL_END;
79 81
80 return res; 82 return res;
81} 83}
82 84
85int
83int fprintf (object_freezer &freezer, const char *format, ...) 86fprintf (object_freezer &freezer, const char *format, ...)
84{ 87{
85 va_list ap; 88 va_list ap;
86 89
87 va_start (ap, format); 90 va_start (ap, format);
88 91
92 freezer.alloc (len); 95 freezer.alloc (len);
93 96
94 va_end (ap); 97 va_end (ap);
95} 98}
96 99
100int
97int fputs (const char *s, object_freezer &freezer) 101fputs (const char *s, object_freezer &freezer)
98{ 102{
99 freezer.add (s); 103 freezer.add (s);
100} 104}
101 105
102static const char thawer_eof[] = "\n\n\n\0\0\0"; 106static const char thawer_eof[] = "\n\n\n\0\0\0";
103 107
104object_thawer::object_thawer (const char *filename) 108object_thawer::object_thawer (const char *path)
109: name (strdup (path))
105{ 110{
106 static const char eof[] = "\n\n\n\0\0\0"; 111 static const char eof[] = "\n\n\n\0\0\0";
107 112
108 av = 0; 113 av = 0;
109 text = 0; 114 text = 0;
110 line = 0; 115 line = 0;
111 116
112 if (filename) 117 if (path)
113 { 118 {
114 CALL_BEGIN (1); 119 CALL_BEGIN (1);
115 CALL_ARG_SV (newSVpv (filename, 0)); 120 CALL_ARG_SV (newSVpv (path, 0));
116 CALL_CALL ("cf::object_thawer_load", G_ARRAY); 121 CALL_CALL ("cf::object_thawer_load", G_ARRAY);
117 122
118 if (count == 2) 123 if (count == 2)
119 { 124 {
120 // second value - perl objects 125 // second value - perl objects
141 CALL_END; 146 CALL_END;
142 } 147 }
143} 148}
144 149
145object_thawer::object_thawer (const char *data, AV *perlav) 150object_thawer::object_thawer (const char *data, AV *perlav)
151: name (strdup ("(memory stream"))
146{ 152{
147 av = perlav; 153 av = perlav;
148 text = newSVpv (data, 0); 154 text = newSVpv (data, 0);
149 sv_catpv (text, thawer_eof); 155 sv_catpv (text, thawer_eof);
150 line = SvPVbyte_nolen (text); 156 line = SvPVbyte_nolen (text);
151} 157}
152 158
159void
153void object_thawer::get (attachable *obj, int oid) 160object_thawer::get (attachable *obj, int oid)
154{ 161{
155 if (!av || oid < 0) // this is actually an error of sorts 162 if (!av || oid < 0) // this is actually an error of sorts
156 return; 163 return;
157 164
158 SV **svp = av_fetch ((AV *)av, oid, 0); 165 SV **svp = av_fetch ((AV *)av, oid, 0);
206 213
207object_thawer::~object_thawer () 214object_thawer::~object_thawer ()
208{ 215{
209 if (text) SvREFCNT_dec (text); 216 if (text) SvREFCNT_dec (text);
210 if (av) SvREFCNT_dec (av); 217 if (av) SvREFCNT_dec (av);
211}
212 218
219 free ((void *)name);
220}
221
222char *
213char *fgets (char *s, int n, object_thawer &thawer) 223fgets (char *s, int n, object_thawer &thawer)
214{ 224{
215 char *p = thawer.line; 225 char *p = thawer.line;
216 char *q = s; 226 char *q = s;
217 227
218 if (!p) 228 if (!p)
233 thawer.line = p; 243 thawer.line = p;
234 244
235 return s == q ? 0 : s; 245 return s == q ? 0 : s;
236} 246}
237 247
248keyword
238keyword object_thawer::get_kv () 249object_thawer::get_kv ()
239{ 250{
240 if (!line) 251 if (!line)
241 return KW_EOF; 252 return KW_EOF;
242 253
243 for (;;) 254 for (;;)
284 else 295 else
285 return KW_ERROR; 296 return KW_ERROR;
286 } 297 }
287} 298}
288 299
300void
289void object_thawer::skip_kv (keyword kw) 301object_thawer::skip_kv (keyword kw)
290{ 302{
291 shstr ml; 303 shstr ml;
292 304
293 switch (kw) 305 switch (kw)
294 { 306 {
296 case KW_lore: get_ml (KW_endlore , ml); break; 308 case KW_lore: get_ml (KW_endlore , ml); break;
297 case KW_maplore: get_ml (KW_endmaplore, ml); break; 309 case KW_maplore: get_ml (KW_endmaplore, ml); break;
298 } 310 }
299} 311}
300 312
313void
301void object_thawer::get (shstr &sh) const 314object_thawer::get (shstr &sh) const
302{ 315{
303 if (last_value) 316 if (last_value)
304 sh = last_value; 317 sh = last_value;
305 else 318 else
306 { 319 {
307 sh = "<value missing>"; 320 sh = "<value missing>";
308 LOG (llevError, "keyword requires value: <%.320s>\n", line);//TODO: add filename 321 LOG (llevError, "keyword \"%s\" requires value, substituting with <value missing>\n", last_keyword);//TODO: add filename
309 } 322 }
310} 323}
311 324
325void
312void object_thawer::get_ml (keyword kend, shstr &sh) 326object_thawer::get_ml (keyword kend, shstr &sh)
313{ 327{
314 char kw[128]; 328 char kw[128];
315 329
316 int klen = keyword_len [kend]; 330 int klen = keyword_len [kend];
317 331
349 while (*line++ != '\n') 363 while (*line++ != '\n')
350 ; 364 ;
351 } 365 }
352} 366}
353 367
368sint32
354sint32 object_thawer::get_sint32 () const 369object_thawer::get_sint32 () const
355{ 370{
356 char *p = last_value; 371 char *p = last_value;
357 372
358 if (!p) 373 if (!p)
359 return 0; 374 return 0;
377 while (*p); 392 while (*p);
378 393
379 return negate ? -val : val; 394 return negate ? -val : val;
380} 395}
381 396
397sint64
382sint64 object_thawer::get_sint64 () const 398object_thawer::get_sint64 () const
383{ 399{
384 return last_value ? atoll (last_value) : 0; 400 return last_value ? atoll (last_value) : 0;
385} 401}
386 402
403double
387double object_thawer::get_double () const 404object_thawer::get_double () const
388{ 405{
389 return last_value ? atof (last_value) : 0; 406 return last_value ? atof (last_value) : 0;
390} 407}
391 408

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines