New patches by Andrew to fix various problems
Add cast for Lance
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 3e12639..45907e8 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.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,10 +27,10 @@
 /* XXX The functional organization of this file is terrible */
 
 #include "allobjects.h"
-#include "intrcheck.h"
 #include "longintrepr.h"
 #include <math.h>
 #include <assert.h>
+#include <ctype.h>
 
 #define ABS(x) ((x) < 0 ? -(x) : (x))
 
@@ -43,10 +43,10 @@
 
 static int ticker;	/* XXX Could be shared with ceval? */
 
-#define INTRCHECK(block) \
+#define SIGCHECK(block) \
 	if (--ticker < 0) { \
 		ticker = 100; \
-		if (intrcheck()) { block; } \
+		if (sigcheck()) { block; } \
 	}
 
 /* Normalize (remove leading zeros from) a long int object.
@@ -84,6 +84,7 @@
 	long ival;
 {
 	/* Assume a C long fits in at most 3 'digits' */
+	/* XXX On 64 bit machines this isn't true!!! */
 	longobject *v = alloclongobject(3);
 	if (v != NULL) {
 		if (ival < 0) {
@@ -92,7 +93,7 @@
 		}
 		v->ob_digit[0] = ival & MASK;
 		v->ob_digit[1] = (ival >> SHIFT) & MASK;
-		v->ob_digit[2] = (ival >> (2*SHIFT)) & MASK;
+		v->ob_digit[2] = ((unsigned long)ival >> (2*SHIFT)) & MASK;
 		v = long_normalize(v);
 	}
 	return (object *)v;
@@ -190,7 +191,7 @@
 		i = -(i);
 	}
 	while (--i >= 0) {
-		x = x*multiplier + v->ob_digit[i];
+		x = x*multiplier + (double)v->ob_digit[i];
 	}
 	return x * sign;
 }
@@ -315,10 +316,9 @@
 		*--p = rem;
 		DECREF(a);
 		a = temp;
-		INTRCHECK({
+		SIGCHECK({
 			DECREF(a);
 			DECREF(str);
-			err_set(KeyboardInterrupt);
 			return NULL;
 		})
 	} while (ABS(a->ob_size) != 0);
@@ -352,23 +352,39 @@
 
 /* Convert a string to a long int object, in a given base.
    Base zero implies a default depending on the number.
-   External linkage: used in compile.c for literals. */
+   External linkage: used in compile.c and stropmodule.c. */
 
 object *
 long_scan(str, base)
 	char *str;
 	int base;
 {
+	return long_escan(str, (char **)NULL, base);
+}
+
+object *
+long_escan(str, pend, base)
+	char *str;
+	char **pend;
+	int base;
+{
 	int sign = 1;
 	longobject *z;
 	
-	assert(base == 0 || base >= 2 && base <= 36);
+	if (base != 0 && base < 2 || base > 36) {
+		err_setstr(ValueError, "invalid base for long literal");
+		return NULL;
+	}
+	while (*str != '\0' && isspace(*str))
+		str++;
 	if (*str == '+')
 		++str;
 	else if (*str == '-') {
 		++str;
 		sign = -1;
 	}
+	while (*str != '\0' && isspace(*str))
+		str++;
 	if (base == 0) {
 		if (str[0] != '0')
 			base = 10;
@@ -398,6 +414,8 @@
 	}
 	if (sign < 0 && z != NULL && z->ob_size != 0)
 		z->ob_size = -(z->ob_size);
+	if (pend)
+		*pend = str;
 	return (object *) z;
 }
 
@@ -487,10 +505,9 @@
 		stwodigits carry = 0;
 		int i;
 		
-		INTRCHECK({
+		SIGCHECK({
 			DECREF(a);
 			a = NULL;
-			err_set(KeyboardInterrupt);
 			break;
 		})
 		if (vj == w->ob_digit[size_w-1])
@@ -564,7 +581,7 @@
 static object *long_div PROTO((longobject *, longobject *));
 static object *long_mod PROTO((longobject *, longobject *));
 static object *long_divmod PROTO((longobject *, longobject *));
-static object *long_pow PROTO((longobject *, longobject *));
+static object *long_pow PROTO((longobject *, longobject *, longobject *));
 static object *long_neg PROTO((longobject *));
 static object *long_pos PROTO((longobject *));
 static object *long_abs PROTO((longobject *));
@@ -720,7 +737,7 @@
 	for (i = 0; i < size_b; ++i) {
 		/* The following assumes unsigned arithmetic
 		   works module 2**N for some N>SHIFT. */
-		borrow = a->ob_digit[i] - b->ob_digit[i] - borrow; 
+		borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
 		z->ob_digit[i] = borrow & MASK;
 		borrow >>= SHIFT;
 		borrow &= 1; /* Keep only one sign bit */
@@ -807,9 +824,8 @@
 		twodigits f = a->ob_digit[i];
 		int j;
 		
-		INTRCHECK({
+		SIGCHECK({
 			DECREF(z);
-			err_set(KeyboardInterrupt);
 			return NULL;
 		})
 		for (j = 0; j < size_b; ++j) {
@@ -933,11 +949,12 @@
 }
 
 static object *
-long_pow(a, b)
+long_pow(a, b, c)
 	longobject *a;
 	longobject *b;
+	longobject *c;
 {
-	longobject *z;
+	longobject *z, *div, *mod;
 	int size_b, i;
 	
 	size_b = b->ob_size;
@@ -945,21 +962,25 @@
 		err_setstr(ValueError, "long integer to the negative power");
 		return NULL;
 	}
-
 	z = (longobject *)newlongobject(1L);
-	
 	INCREF(a);
 	for (i = 0; i < size_b; ++i) {
 		digit bi = b->ob_digit[i];
 		int j;
-		
+	
 		for (j = 0; j < SHIFT; ++j) {
 			longobject *temp;
-			
+		
 			if (bi & 1) {
 				temp = (longobject *)long_mul(z, a);
 				DECREF(z);
-				z = temp;
+			 	if ((object*)c!=None && temp!=NULL) {
+			 		l_divmod(temp, c, &div, &mod);
+				 	XDECREF(div);
+				 	DECREF(temp);
+				 	temp = mod;
+				}
+			 	z = temp;
 				if (z == NULL)
 					break;
 			}
@@ -968,6 +989,12 @@
 				break;
 			temp = (longobject *)long_mul(a, a);
 			DECREF(a);
+		 	if ((object*)c!=None && temp!=NULL) {
+			 	l_divmod(temp, c, &div, &mod);
+			 	XDECREF(div);
+			 	DECREF(temp);
+			 	temp = mod;
+			}
 			a = temp;
 			if (a == NULL) {
 				DECREF(z);
@@ -979,6 +1006,12 @@
 			break;
 	}
 	XDECREF(a);
+	if ((object*)c!=None && z!=NULL) {
+			l_divmod(z, c, &div, &mod);
+			XDECREF(div);
+			DECREF(z);
+			z=mod;
+	}
 	return (object *)z;
 }
 
@@ -1214,7 +1247,7 @@
 			negz = -1;
 		}
 		break;
-	case '&': 
+	case '&':
 		if (maska && maskb) {
 			op = '|';
 			maska ^= MASK;
@@ -1330,9 +1363,10 @@
 }
 
 
-#define UF (object* (*) FPROTO((object *))) /* Unary function */
-#define BF (object* (*) FPROTO((object *, object *))) /* Binary function */
-#define IF (int (*) FPROTO((object *))) /* Int function */
+#define UF (unaryfunc)
+#define BF (binaryfunc)
+#define TF (ternaryfunc)
+#define IF (inquiry)
 
 static number_methods long_as_number = {
 	BF long_add,	/*nb_add*/
@@ -1341,7 +1375,7 @@
 	BF long_div,	/*nb_divide*/
 	BF long_mod,	/*nb_remainder*/
 	BF long_divmod,	/*nb_divmod*/
-	BF long_pow,	/*nb_power*/
+	TF long_pow,	/*nb_power*/
 	UF long_neg,	/*nb_negative*/
 	UF long_pos,	/*tp_positive*/
 	UF long_abs,	/*tp_absolute*/
@@ -1353,7 +1387,7 @@
 	BF long_xor,	/*nb_xor*/
 	BF long_or,	/*nb_or*/
 	(int (*) FPROTO((object **, object **)))
-	long_coerce,	/*nb_coerce*/
+	(coercion)long_coerce, /*nb_coerce*/
 	UF long_int,	/*nb_int*/
 	UF long_long,	/*nb_long*/
 	UF long_float,	/*nb_float*/
@@ -1367,16 +1401,16 @@
 	"long int",
 	sizeof(longobject) - sizeof(digit),
 	sizeof(digit),
-	long_dealloc,	/*tp_dealloc*/
+	(destructor)long_dealloc, /*tp_dealloc*/
 	0,		/*tp_print*/
 	0,		/*tp_getattr*/
 	0,		/*tp_setattr*/
 	(int (*) FPROTO((object *, object *)))
-	long_compare,	/*tp_compare*/
-	long_repr,	/*tp_repr*/
+	(cmpfunc)long_compare, /*tp_compare*/
+	(reprfunc)long_repr, /*tp_repr*/
 	&long_as_number,/*tp_as_number*/
 	0,		/*tp_as_sequence*/
 	0,		/*tp_as_mapping*/
 	(long (*) FPROTO((object *)))
-	long_hash,	/*tp_hash*/
+	(hashfunc)long_hash, /*tp_hash*/
 };