<URL: http://bugs.freeciv.org/Ticket/Display.html?id=37920 >
On 3/11/07, Marko Lindqvist <[EMAIL PROTECTED]> wrote: > > va_start() is called only once before any callbacks are called. > *Each* callback tries to iterate through args with va_arg(). Fix. We lost (unused) function script_signal_emit_valist(), but I don't see how that could be correctly implemented. - ML
diff -Nurd -X.diff_ignore freeciv/server/scripting/script_signal.c freeciv/server/scripting/script_signal.c --- freeciv/server/scripting/script_signal.c 2007-03-05 21:09:41.000000000 +0200 +++ freeciv/server/scripting/script_signal.c 2007-03-11 05:57:02.000000000 +0200 @@ -228,13 +228,13 @@ } /************************************************************************** - Invoke all the callback functions attached to a given signal (internal). + Invoke all the callback functions attached to a given signal. **************************************************************************/ -static void internal_signal_invoke_valist(const char *signal_name, - int nargs, va_list args) +void script_signal_emit(const char *signal_name, int nargs, ...) { struct hash_table *hash; struct signal *signal; + va_list args; hash = signals; signal = hash_lookup_data(hash, signal_name); @@ -246,9 +246,12 @@ signal_name, signal->nargs, nargs); } else { signal_callback_list_iterate(signal->callbacks, pcallback) { + va_start(args, nargs); if (script_callback_invoke(pcallback->name, nargs, args)) { + va_end(args); break; } + va_end(args); } signal_callback_list_iterate_end; } } else { @@ -258,27 +261,6 @@ } /************************************************************************** - Invoke all the callback functions attached to a given signal. -**************************************************************************/ -void script_signal_emit_valist(const char *signal_name, - int nargs, va_list args) -{ - internal_signal_invoke_valist(signal_name, nargs, args); -} - -/************************************************************************** - Invoke all the callback functions attached to a given signal. -**************************************************************************/ -void script_signal_emit(const char *signal_name, int nargs, ...) -{ - va_list args; - - va_start(args, nargs); - internal_signal_invoke_valist(signal_name, nargs, args); - va_end(args); -} - -/************************************************************************** Create a new signal type. **************************************************************************/ void script_signal_create_valist(const char *signal_name, diff -Nurd -X.diff_ignore freeciv/server/scripting/script_signal.h freeciv/server/scripting/script_signal.h --- freeciv/server/scripting/script_signal.h 2007-03-05 21:09:41.000000000 +0200 +++ freeciv/server/scripting/script_signal.h 2007-03-11 05:56:56.000000000 +0200 @@ -40,8 +40,6 @@ const char *get_api_type_name(enum api_types id); -void script_signal_emit_valist(const char *signal_name, - int nargs, va_list args); void script_signal_emit(const char *signal_name, int nargs, ...); void script_signal_create_valist(const char *signal_name,
_______________________________________________ Freeciv-dev mailing list Freeciv-dev@gna.org https://mail.gna.org/listinfo/freeciv-dev