$NetBSD: patch-am,v 1.2 2013/03/28 21:25:52 joerg Exp $

--- libs/gib/gib_function.c.orig	2004-04-09 18:18:19.000000000 +0000
+++ libs/gib/gib_function.c
@@ -160,79 +160,108 @@ GIB_Function_Find (const char *name)
 	return (gib_function_t *) Hash_Find (gib_functions, name);
 }
 
+struct prepare_args_data {
+	gib_var_t *var;
+	hashtab_t **zero;
+	unsigned int i, ind;
+	unsigned int argc;
+	const char **args;
+	cbuf_t *cbuf;
+};
+
+static qboolean 
+prepare_args_iterate (void *data_, void *arg_, llist_node_t *node)
+{
+	char *arg = arg_;
+	struct prepare_args_data *data = data_;
+	data->var = GIB_Var_Get_Complex (&GIB_DATA(data->cbuf)->locals, data->zero,
+		arg, &data->ind, true);
+	if (!data->var->array[0].value)
+		data->var->array[0].value = dstring_newstr ();
+	dstring_copystr (data->var->array[0].value, data->args[data->i]);
+	data->i++;
+	return data->i < data->argc;
+}
+
 static void
 GIB_Function_Prepare_Args (cbuf_t * cbuf, const char **args, unsigned int
 		argc, llist_t *arglist)
 {
 	static hashtab_t *zero = 0;
-	unsigned int i, ind;
-	gib_var_t  *var;
+	struct prepare_args_data data;
 	static char argss[] = "args";
 
-	static qboolean 
-	iterate (char *arg, llist_node_t *node)
-	{	
-		var = GIB_Var_Get_Complex (&GIB_DATA(cbuf)->locals, &zero,
-			arg, &ind, true);
-		if (!var->array[0].value)
-			var->array[0].value = dstring_newstr ();
-		dstring_copystr (var->array[0].value, args[i]);
-		i++;
-		return i < argc;
-	}
+	data.cbuf = cbuf;
+	data.argc = argc;
+	data.args = args;
+	data.i = 1;
+	data.zero = &zero;
+	llist_iterate (arglist, prepare_args_iterate, &data);
 	
-	i = 1; llist_iterate (arglist, LLIST_ICAST (iterate));
-	
-	var =
+	data.var =
 		GIB_Var_Get_Complex (&GIB_DATA (cbuf)->locals, &zero, argss,
-			&ind, true);
-	var->array = realloc (var->array, sizeof (struct gib_varray_s) * argc);
-	memset (var->array + 1, 0, (argc - 1) * sizeof (struct gib_varray_s));
-	var->size = argc;
-	for (i = 0; i < argc; i++) {
-		if (var->array[i].value)
-			dstring_clearstr (var->array[i].value);
+			&data.ind, true);
+	data.var->array = realloc (data.var->array, sizeof (struct gib_varray_s) * argc);
+	memset (data.var->array + 1, 0, (argc - 1) * sizeof (struct gib_varray_s));
+	data.var->size = argc;
+	for (data.i = 0; data.i < argc; data.i++) {
+		if (data.var->array[data.i].value)
+			dstring_clearstr (data.var->array[data.i].value);
 		else
-			var->array[i].value = dstring_newstr ();
-		dstring_appendstr (var->array[i].value, args[i]);
+			data.var->array[data.i].value = dstring_newstr ();
+		dstring_appendstr (data.var->array[data.i].value, args[data.i]);
 	}
 }
 
+struct prepare_args_d_data {
+	gib_var_t  *var;
+	unsigned i, ind, argc;
+	hashtab_t **zero;
+	dstring_t **args;
+	cbuf_t *cbuf;
+};
+
+static qboolean 
+iterate (void *data_, void *arg_, llist_node_t *node)
+{
+	char *arg = arg_;
+	struct prepare_args_d_data *data = data_;
+	data->var = GIB_Var_Get_Complex (&GIB_DATA(data->cbuf)->locals, data->zero,
+		arg, &data->ind, true);
+	if (!data->var->array[0].value)
+		data->var->array[0].value = dstring_newstr ();
+	dstring_copystr (data->var->array[0].value, data->args[data->i]->str);
+	data->i++;
+	return data->i < data->argc;
+}
+
 static void
 GIB_Function_Prepare_Args_D (cbuf_t * cbuf, dstring_t **args, unsigned int
 		argc, llist_t *arglist)
 {
+	struct prepare_args_d_data data;
 	static hashtab_t *zero = 0;
-	unsigned int i, ind;
-	gib_var_t  *var;
 	static char argss[] = "args";
 
-	static qboolean 
-	iterate (char *arg, llist_node_t *node)
-	{	
-		var = GIB_Var_Get_Complex (&GIB_DATA(cbuf)->locals, &zero,
-			arg, &ind, true);
-		if (!var->array[0].value)
-			var->array[0].value = dstring_newstr ();
-		dstring_copystr (var->array[0].value, args[i]->str);
-		i++;
-		return i < argc;
-	}
-	
-	i = 1; llist_iterate (arglist, LLIST_ICAST (iterate));
-	
-	var =
+	data.cbuf = cbuf;
+	data.argc = argc;
+	data.args = args;
+	data.zero = &zero;
+	data.i = 1;
+	llist_iterate (arglist, iterate, &data);
+
+	data.var =
 		GIB_Var_Get_Complex (&GIB_DATA (cbuf)->locals, &zero, argss,
-				&ind, true);
-	var->array = realloc (var->array, sizeof (struct gib_varray_s) * argc);
-	memset (var->array + 1, 0, (argc - 1) * sizeof (struct gib_varray_s));
-	var->size = argc;
-	for (i = 0; i < argc; i++) {
-		if (var->array[i].value)
-			dstring_clearstr (var->array[i].value);
+				&data.ind, true);
+	data.var->array = realloc (data.var->array, sizeof (struct gib_varray_s) * argc);
+	memset (data.var->array + 1, 0, (argc - 1) * sizeof (struct gib_varray_s));
+	data.var->size = argc;
+	for (data.i = 0; data.i < argc; data.i++) {
+		if (data.var->array[data.i].value)
+			dstring_clearstr (data.var->array[data.i].value);
 		else
-			var->array[i].value = dstring_newstr ();
-		dstring_appendstr (var->array[i].value, args[i]->str);
+			data.var->array[data.i].value = dstring_newstr ();
+		dstring_appendstr (data.var->array[data.i].value, args[data.i]->str);
 	}
 }
 
