<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

Reply via email to