diff --git a/Objects/listobject.c b/Objects/listobject.c
index 76d2a0e..a3e4cb9 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -27,6 +27,11 @@
 #include "allobjects.h"
 #include "modsupport.h"
 #include "ceval.h"
+#ifdef STDC_HEADERS
+#include <stddef.h>
+#else
+#include <sys/types.h>		/* For size_t */
+#endif
 
 object *
 newlistobject(size)
@@ -34,7 +39,7 @@
 {
 	int i;
 	listobject *op;
-	MALLARG nbytes;
+	size_t nbytes;
 	if (size < 0) {
 		err_badcall();
 		return NULL;
@@ -211,21 +216,17 @@
 list_repr(v)
 	listobject *v;
 {
-	object *s, *t, *comma;
+	object *s, *comma;
 	int i;
 	s = newstringobject("[");
 	comma = newstringobject(", ");
 	for (i = 0; i < v->ob_size && s != NULL; i++) {
 		if (i > 0)
 			joinstring(&s, comma);
-		t = reprobject(v->ob_item[i]);
-		joinstring(&s, t);
-		DECREF(t);
+		joinstring_decref(&s, reprobject(v->ob_item[i]));
 	}
-	DECREF(comma);
-	t = newstringobject("]");
-	joinstring(&s, t);
-	DECREF(t);
+	XDECREF(comma);
+	joinstring_decref(&s, newstringobject("]"));
 	return s;
 }
 
@@ -500,15 +501,11 @@
 	return ins(self, (int) self->ob_size, v);
 }
 
-static object *cmpfunc;
+static object *comparefunc;
 
 static int
 cmp(v, w)
-#ifdef __STDC__
-	void *v, *w;
-#else
-	char *v, *w;
-#endif
+	const ANY *v, *w;
 {
 	object *t, *res;
 	long i;
@@ -516,14 +513,14 @@
 	if (err_occurred())
 		return 0;
 
-	if (cmpfunc == NULL)
+	if (comparefunc == NULL)
 		return cmpobject(* (object **) v, * (object **) w);
 
 	/* Call the user-supplied comparison function */
 	t = mkvalue("OO", * (object **) v, * (object **) w);
 	if (t == NULL)
 		return 0;
-	res = call_object(cmpfunc, t);
+	res = call_object(comparefunc, t);
 	DECREF(t);
 	if (res == NULL)
 		return 0;
@@ -547,24 +544,24 @@
 	listobject *self;
 	object *args;
 {
-	object *save_cmpfunc;
+	object *save_comparefunc;
 	if (self->ob_size <= 1) {
 		INCREF(None);
 		return None;
 	}
-	save_cmpfunc = cmpfunc;
-	cmpfunc = args;
-	if (cmpfunc != NULL) {
+	save_comparefunc = comparefunc;
+	comparefunc = args;
+	if (comparefunc != NULL) {
 		/* Test the comparison function for obvious errors */
-		(void) cmp(&self->ob_item[0], &self->ob_item[1]);
+		(void) cmp((ANY *)&self->ob_item[0], (ANY *)&self->ob_item[1]);
 		if (err_occurred()) {
-			cmpfunc = save_cmpfunc;
+			comparefunc = save_comparefunc;
 			return NULL;
 		}
 	}
 	qsort((char *)self->ob_item,
 				(int) self->ob_size, sizeof(object *), cmp);
-	cmpfunc = save_cmpfunc;
+	comparefunc = save_comparefunc;
 	if (err_occurred())
 		return NULL;
 	INCREF(None);
@@ -612,6 +609,32 @@
 	return 0;
 }
 
+object *
+listtuple(v)
+	object *v;
+{
+	object *w;
+	object **p;
+	int n;
+	if (v == NULL || !is_listobject(v)) {
+		err_badcall();
+		return NULL;
+	}
+	n = ((listobject *)v)->ob_size;
+	w = newtupleobject(n);
+	if (w == NULL)
+		return NULL;
+	p = ((tupleobject *)w)->ob_item;
+	memcpy((ANY *)p,
+	       (ANY *)((listobject *)v)->ob_item,
+	       n*sizeof(object *));
+	while (--n >= 0) {
+		INCREF(*p);
+		p++;
+	}
+	return w;
+}
+
 static object *
 listindex(self, args)
 	listobject *self;
@@ -675,13 +698,13 @@
 }
 
 static struct methodlist list_methods[] = {
-	{"append",	listappend},
-	{"count",	listcount},
-	{"index",	listindex},
-	{"insert",	listinsert},
-	{"sort",	listsort},
-	{"remove",	listremove},
-	{"reverse",	listreverse},
+	{"append",	(method)listappend},
+	{"count",	(method)listcount},
+	{"index",	(method)listindex},
+	{"insert",	(method)listinsert},
+	{"sort",	(method)listsort},
+	{"remove",	(method)listremove},
+	{"reverse",	(method)listreverse},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -694,13 +717,13 @@
 }
 
 static sequence_methods list_as_sequence = {
-	list_length,	/*sq_length*/
-	list_concat,	/*sq_concat*/
-	list_repeat,	/*sq_repeat*/
-	list_item,	/*sq_item*/
-	list_slice,	/*sq_slice*/
-	list_ass_item,	/*sq_ass_item*/
-	list_ass_slice,	/*sq_ass_slice*/
+	(inquiry)list_length, /*sq_length*/
+	(binaryfunc)list_concat, /*sq_concat*/
+	(intargfunc)list_repeat, /*sq_repeat*/
+	(intargfunc)list_item, /*sq_item*/
+	(intintargfunc)list_slice, /*sq_slice*/
+	(intobjargproc)list_ass_item, /*sq_ass_item*/
+	(intintobjargproc)list_ass_slice, /*sq_ass_slice*/
 };
 
 typeobject Listtype = {
@@ -709,12 +732,12 @@
 	"list",
 	sizeof(listobject),
 	0,
-	list_dealloc,	/*tp_dealloc*/
-	list_print,	/*tp_print*/
-	list_getattr,	/*tp_getattr*/
+	(destructor)list_dealloc, /*tp_dealloc*/
+	(printfunc)list_print, /*tp_print*/
+	(getattrfunc)list_getattr, /*tp_getattr*/
 	0,		/*tp_setattr*/
-	list_compare,	/*tp_compare*/
-	list_repr,	/*tp_repr*/
+	(cmpfunc)list_compare, /*tp_compare*/
+	(reprfunc)list_repr, /*tp_repr*/
 	0,		/*tp_as_number*/
 	&list_as_sequence,	/*tp_as_sequence*/
 	0,		/*tp_as_mapping*/
