--- deliantra/server/include/cfperl.h 2009/11/05 14:38:48 1.110 +++ deliantra/server/include/cfperl.h 2009/11/11 23:27:57 1.112 @@ -198,7 +198,7 @@ F_DESTROYED = 0x01, F_DEBUG_TRACE = 0x02, }; - uint8 ACC (RW, flags); + uint8 ACC (RW, attachable_flags); static unordered_vector mortals; MTH static void check_mortals (); @@ -214,7 +214,7 @@ MTH void destroy (); // return wether an object was destroyed already - MTH bool destroyed () const { return flags & F_DESTROYED; } + MTH bool destroyed () const { return attachable_flags & F_DESTROYED; } virtual void gather_callbacks (AV *&callbacks, event_type event) const; @@ -232,12 +232,12 @@ void optimise (); // possibly save some memory by destroying unneeded data attachable () - : flags (0), self (0), cb (0), attach (0) + : attachable_flags (0), self (0), cb (0), attach (0) { } attachable (const attachable &src) - : flags (0), self (0), cb (0), attach (src.attach) + : attachable_flags (0), self (0), cb (0), attach (src.attach) { } @@ -288,6 +288,30 @@ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// a little dirty hack, maybe unify with something else at a later time +struct keyword_string +{ + const char *s; + const int l; + + keyword_string (const char *s, int l) + : s(s), l(l) + { } + + keyword_string (keyword kw) + : s(keyword_str [kw]), l(keyword_len [kw]) + { + } + + keyword_string (shstr_tmp sh) + : s(&sh), l(sh.length ()) + { + } +}; + +#define CS(keyword) keyword_string (# keyword, sizeof (# keyword) - 1) +#define KW(keyword) CS(keyword) + INTERFACE_CLASS(object_freezer) struct object_freezer : dynbuf_text { @@ -296,91 +320,85 @@ object_freezer (); ~object_freezer (); - void put (attachable *ext); - - // used only for user-defined key-value pairs - void put (shstr_tmp k, shstr_tmp v) + // serialise perl part + void put_ (attachable *ext); + void put (attachable *ext) { - add (k); - - if (expect_true (v)) - add (' '), add (v); - - add ('\n'); + if (expect_false (ext->self)) + put_ (ext); } - template - void put_kw_string (keyword k, const T &v) + // null value (== no space after keyword) + void put (const keyword_string k) { - int klen = keyword_len [k]; - int vlen = v ? strlen (v) + 1 : 0; - - char *p = (char *)alloc (klen + vlen + 1); - - memcpy (p, keyword_str [k], klen); p += klen; - - if (expect_true (v)) - { - *p++ = ' '; vlen--; - memcpy (p, v, vlen); p += vlen; - } + char *p = force (k.l + 1); + memcpy (p, k.s, k.l); p += k.l; *p++ = '\n'; + alloc (p); + } - *p = '\n'; + void put (const keyword_string k, const keyword_string v) + { + char *p = force (k.l + 1 + v.l + 1); + memcpy (p, k.s, k.l); p += k.l; *p++ = ' '; + memcpy (p, v.s, v.l); p += v.l; *p++ = '\n'; + alloc (p); } - void put (keyword k, const char *v = 0) + void put (const keyword_string k, const char *v) { - put_kw_string (k, v); + if (expect_true (v)) + put (k, keyword_string (v, strlen (v))); + else + put (k); } - void put (keyword k, shstr_tmp v) + void put (const keyword_string k, shstr_tmp v) { - put_kw_string (k, v); + put (k, keyword_string (v)); } - void put (keyword k, double v) + void put (const keyword_string k, double v) { - force (MAX_KEYWORD_LEN + 2 + 32); - fadd (keyword_str [k], keyword_len [k]); - fadd (' '); - falloc (sprintf (ptr, "%.7g", v)); - fadd ('\n'); + char *p = force (MAX_KEYWORD_LEN + 2 + 32); + memcpy (p, k.s, k.l); p += k.l; *p++ = ' '; + p += sprintf (p, "%.7g", v); *p++ = '\n'; + alloc (p); } - void put_(keyword k, sint64 v) + void put_(const keyword_string k, sint64 v) { force (MAX_KEYWORD_LEN + 2 + sint64_digits); - fadd (keyword_str [k], keyword_len [k]); + fadd (k.s, k.l); fadd (' '); add (v); fadd ('\n'); } - void put_(keyword k, sint32 v) + void put_(const keyword_string k, sint32 v) { force (MAX_KEYWORD_LEN + 2 + sint32_digits); - fadd (keyword_str [k], keyword_len [k]); + fadd (k.s, k.l); fadd (' '); add (v); fadd ('\n'); } - void put (keyword k, float v) { put (k, (double)v); } - void put (keyword k, signed char v) { put_(k, (sint32)v); } - void put (keyword k, unsigned char v) { put_(k, (sint32)v); } - void put (keyword k, signed short v) { put_(k, (sint32)v); } - void put (keyword k, unsigned short v) { put_(k, (sint32)v); } - void put (keyword k, signed int v) { put_(k, (sint32)v); } - void put (keyword k, unsigned int v) { put_(k, (sint64)v); } - void put (keyword k, signed long v) { put_(k, (sint64)v); } - void put (keyword k, unsigned long v) { put_(k, (sint64)v); } - void put (keyword k, signed long long v) { put_(k, (sint64)v); } - void put (keyword k, unsigned long long v) { put_(k, (sint64)v); } + void put (const keyword_string k, float v) { put (k, (double)v); } + void put (const keyword_string k, signed char v) { put_(k, (sint32)v); } + void put (const keyword_string k, unsigned char v) { put_(k, (sint32)v); } + void put (const keyword_string k, signed short v) { put_(k, (sint32)v); } + void put (const keyword_string k, unsigned short v) { put_(k, (sint32)v); } + void put (const keyword_string k, signed int v) { put_(k, (sint32)v); } + void put (const keyword_string k, unsigned int v) { put_(k, (sint64)v); } + void put (const keyword_string k, signed long v) { put_(k, (sint64)v); } + void put (const keyword_string k, unsigned long v) { put_(k, (sint64)v); } + void put (const keyword_string k, signed long long v) { put_(k, (sint64)v); } + void put (const keyword_string k, unsigned long long v) { put_(k, (sint64)v); } - void put (keyword kbeg, keyword kend, shstr_tmp v) + void put (const keyword_string kbeg, const keyword_string kend, shstr_tmp v) { force (MAX_KEYWORD_LEN + 1); - fadd (keyword_str [kbeg], keyword_len [kbeg]); fadd ('\n'); + fadd (kbeg.s, kbeg.l); fadd ('\n'); if (expect_true (v)) { @@ -389,15 +407,15 @@ } force (MAX_KEYWORD_LEN + 1); - fadd (keyword_str [kend], keyword_len [kend]); fadd ('\n'); + fadd (kend.s, kend.l); fadd ('\n'); } - void put (keyword k, archetype *v); - void put (keyword k, treasurelist *v); - void put (keyword k, faceinfo *v); + void put (const keyword_string k, archetype *v); + void put (const keyword_string k, treasurelist *v); + void put (const keyword_string k, faceinfo *v); template - void put (keyword k, const refptr &v) + void put (const keyword_string k, const refptr &v) { put (k, (T *)v); }