--- deliantra/server/include/cfperl.h 2007/05/24 03:33:29 1.65 +++ deliantra/server/include/cfperl.h 2007/05/27 23:14:37 1.67 @@ -112,14 +112,13 @@ #define ARG_REGION(o) DT_REGION, (void *)(static_cast (o)) // the ", ## __VA_ARGS" is, unfortunately, a gnu-cpp extension - -// all these return true when the normal event processing should be skipped (if any) -#define INVOKE_GLOBAL(event, ...) gbl_ev.invoke (EVENT_ ## GLOBAL ## _ ## event, ## __VA_ARGS__, DT_END) -#define INVOKE_ATTACHABLE(event, obj, ...) (obj)->invoke (EVENT_ ## ATTACHABLE ## _ ## event, ## __VA_ARGS__, DT_END) -#define INVOKE_OBJECT(event, obj, ...) (obj)->invoke (EVENT_ ## OBJECT ## _ ## event, ## __VA_ARGS__, DT_END) -#define INVOKE_CLIENT(event, obj, ...) (obj)->invoke (EVENT_ ## CLIENT ## _ ## event, ## __VA_ARGS__, DT_END) -#define INVOKE_PLAYER(event, obj, ...) (obj)->invoke (EVENT_ ## PLAYER ## _ ## event, ## __VA_ARGS__, DT_END) -#define INVOKE_MAP(event, obj, ...) (obj)->invoke (EVENT_ ## MAP ## _ ## event, ## __VA_ARGS__, DT_END) +#define INVOKE(obj,event, ...) (expect_false ((obj)->should_invoke (event)) ? (obj)->invoke (event, ## __VA_ARGS__, DT_END) : 0) +#define INVOKE_GLOBAL(event, ...) INVOKE (&gbl_ev, EVENT_ ## GLOBAL ## _ ## event, ## __VA_ARGS__) +#define INVOKE_ATTACHABLE(event, obj, ...) INVOKE (obj , EVENT_ ## ATTACHABLE ## _ ## event, ## __VA_ARGS__) +#define INVOKE_OBJECT(event, obj, ...) INVOKE (obj , EVENT_ ## OBJECT ## _ ## event, ## __VA_ARGS__) +#define INVOKE_CLIENT(event, obj, ...) INVOKE (obj , EVENT_ ## CLIENT ## _ ## event, ## __VA_ARGS__) +#define INVOKE_PLAYER(event, obj, ...) INVOKE (obj , EVENT_ ## PLAYER ## _ ## event, ## __VA_ARGS__) +#define INVOKE_MAP(event, obj, ...) INVOKE (obj , EVENT_ ## MAP ## _ ## event, ## __VA_ARGS__) //TODO should index into @result #define RESULT(idx,type) cfperl_result_ ## type (idx) @@ -192,18 +191,14 @@ attachable &operator =(const attachable &src); - bool vinvoke (event_type event, va_list &ap); - bool invoke (event_type event, ...) + // used to _quickly_ device wether to shortcut the evaluation + bool should_invoke (event_type event) { - if (ev_want_event [event] || cb) - { - va_list ap; - va_start (ap, event); - vinvoke (event, ap); - va_end (ap); - } + return ev_want_event [event] || cb; } + bool invoke (event_type event, ...); + MTH void instantiate (); void reattach (); @@ -239,7 +234,7 @@ { add (k); - if (v) + if (expect_true (v)) add (' '), add (v); add ('\n'); @@ -264,7 +259,7 @@ memcpy (p, keyword_str [k], klen); p += klen; - if (v) + if (expect_true (v)) { *p++ = ' '; vlen--; memcpy (p, v, vlen); p += vlen; @@ -312,7 +307,7 @@ { add (keyword_str [kbeg], keyword_len [kbeg]); add ('\n'); - if (v) + if (expect_true (v)) { add (v); add ('\n'); @@ -336,7 +331,7 @@ template void put (keyword k, const T *v) { - if (v) + if (expect_true (v)) put (k, v->name); else put (k, (const char *)0); @@ -354,18 +349,16 @@ operator bool () { return !!av; } }; -// compatibility support, should be removed when no longer needed -void fprintf (object_freezer &freezer, const char *format, ...); -void fputs (const char *s, object_freezer &freezer); - struct object_thawer { + char *line; // current beginning of line SV *text; // text part AV *av; // perl part int linenum; - char *line; // current beginning of line keyword kw; - char *kw_str, *value; + char *kw_str; // the keyword parsed, as string + char *value; // the value, or 0 if no value + char *value_nn; // the value, or the empty string if no value const char *name; operator bool () { return !!text; } @@ -390,19 +383,20 @@ } char *get_str () { return value; } // may be 0 + void get_ml (keyword kend, shstr &sh); - void get (shstr &sh) const; void get_ornull (shstr &sh) const { sh = value; } - void get_ml (keyword kend, shstr &sh); + void get (shstr &sh) const { sh = value; } // might want to check for non-null here + bool get_bool () const { return *value_nn == '1'; } sint32 get_sint32 () const; - sint64 get_sint64 () const; - double get_double () const; + sint64 get_sint64 () const { return atoll (value_nn); } + double get_double () const { return atof (value_nn); } void get (float &v) { v = get_double (); } void get (double &v) { v = get_double (); } - void get (bool &i) { i = get_sint32 (); } + void get (bool &i) { i = get_bool (); } void get (sint8 &i) { i = get_sint32 (); } void get (uint8 &i) { i = get_sint32 (); } void get (sint16 &i) { i = get_sint32 (); } @@ -436,19 +430,19 @@ static void cede_every (int count) { - if (++cede_counter >= count) + if (expect_false (++cede_counter >= count)) do_cede_every (); } static void cede_to_tick () { - if (time () >= next_cede) + if (expect_false (time () >= next_cede)) do_cede_to_tick (); } static void cede_to_tick_every (int count) { - if (++cede_counter >= count) + if (expect_false (++cede_counter >= count)) cede_to_tick (); }