Use an extendable array to store the lists of strings.
Only make wrapper argument lists if we're going to use them.

diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c
new file mode 100644
index 0000000..bd7d7a5
--- /dev/null
+++ b/tools/winegcc/utils.c
@@ -0,0 +1,127 @@
+/*
+ * Useful functions for winegcc/winewrap
+ *
+ * Copyright 2000 Francois Gouget
+ * Copyright 2002 Dimitrie O. Paun
+ * Copyright 2003 Richard Cohen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "utils.h"
+
+#if !defined(min)
+# define min(x,y) (((x) < (y)) ? (x) : (y))
+#endif
+
+int verbose = 0;
+
+void error(const char *s, ...)
+{
+    va_list ap;
+    
+    va_start(ap, s);
+    fprintf(stderr, "Error: ");
+    vfprintf(stderr, s, ap);
+    fprintf(stderr, "\n");
+    va_end(ap);
+    exit(2);
+}
+
+void *xmalloc(size_t size)
+{
+    void *p;
+    if ((p = malloc (size)) == NULL)
+	error("Can not malloc %d bytes.", size);
+
+    return p;
+}
+
+void *xrealloc(void* p, size_t size)
+{
+    void* p2;
+    if ((p2 = realloc (p, size)) == NULL)
+	error("Can not realloc %d bytes.", size);
+
+    return p2;
+}
+
+char *strmake(const char *fmt, ...)
+{
+    int n;
+    size_t size = 100;
+    char *p;
+    va_list ap;
+    p = xmalloc (size);
+
+    while (1)
+    {
+        va_start(ap, fmt);
+	n = vsnprintf (p, size, fmt, ap);
+	va_end(ap);
+        if (n > -1 && n < size) return p;
+	size = min( size*2, n+1 );
+	p = xrealloc (p, size);
+    }
+}
+
+strarray *strarray_alloc(void)
+{
+    strarray *arr = xmalloc(sizeof(*arr));
+    arr->maximum = arr->size = 0;
+    arr->base = NULL;
+    return arr;
+}
+
+void strarray_free(strarray* arr)
+{
+    free(arr->base);
+    free(arr);
+}
+
+void strarray_add(strarray* arr, char* str)
+{
+    if (arr->size == arr->maximum)
+    {
+	arr->maximum += 10;
+	arr->base = xrealloc(arr->base, sizeof(*(arr->base)) * arr->maximum);
+    }
+    arr->base[arr->size++] = str;
+}
+
+void spawn(strarray* arr)
+{
+    int i, status;
+    char **argv = arr->base;
+
+    if (verbose)
+    {
+	for(i = 0; argv[i]; i++) printf("%s ", argv[i]);
+	printf("\n");
+    }
+    if (!(status = spawnvp( _P_WAIT, argv[0], argv))) return;
+
+    if (status > 0) error("%s failed.", argv[0]);
+    else perror("Error:");
+    exit(3);
+}