Changes for Lee Busby's SIGFPE patch set.
New file pyfpe.c and exception FloatingPointError.
Surround some f.p. operations with PyFPE macro brackets.
diff --git a/Python/Makefile.in b/Python/Makefile.in
index 5be2532..e8cc39f 100644
--- a/Python/Makefile.in
+++ b/Python/Makefile.in
@@ -41,7 +41,7 @@
 		getplatform.o getversion.o graminit.o \
 		import.o importdl.o \
 		marshal.o modsupport.o mystrtoul.o \
-		pythonrun.o \
+		pyfpe.o pythonrun.o \
 		sigcheck.o structmember.o sysmodule.o \
 		traceback.o \
 		$(LIBOBJS)
@@ -107,6 +107,7 @@
 memmove.o: memmove.c
 modsupport.o: modsupport.c
 mystrtoul.o: mystrtoul.c
+pyfpe.o: pyfpe.c
 pythonrun.o: pythonrun.c
 sigcheck.o: sigcheck.c
 strerror.o: strerror.c
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index d1dc9a5..29e3393 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -1621,6 +1621,7 @@
 object *AttributeError;
 object *ConflictError;
 object *EOFError;
+object *FloatingPointError;
 object *IOError;
 object *ImportError;
 object *IndexError;
@@ -1654,6 +1655,7 @@
 	AttributeError = newstdexception("AttributeError");
 	ConflictError = newstdexception("ConflictError");
 	EOFError = newstdexception("EOFError");
+	FloatingPointError = newstdexception("FloatingPointError");
 	IOError = newstdexception("IOError");
 	ImportError = newstdexception("ImportError");
 	IndexError = newstdexception("IndexError");
diff --git a/Python/compile.c b/Python/compile.c
index e06f345..0ee5519 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -782,6 +782,7 @@
 	extern double atof PROTO((const char *));
 	char *end;
 	long x;
+	double dx;
 #ifndef WITHOUT_COMPLEX
 	Py_complex c;
 	int imflag;
@@ -810,12 +811,18 @@
 #ifndef WITHOUT_COMPLEX
 	if (imflag) {
 		c.real = 0.;
+		PyFPE_START_PROTECT("atof", return 0)
 		c.imag = atof(s);
+		PyFPE_END_PROTECT
 		return newcomplexobject(c);
 	}
-	else
+	else {
 #endif
-		return newfloatobject(atof(s));
+		PyFPE_START_PROTECT("atof", return 0)
+		dx = atof(s);
+		PyFPE_END_PROTECT
+		return newfloatobject(dx);
+	}
 }
 
 static object *
diff --git a/Python/marshal.c b/Python/marshal.c
index 0ad493a..f4634f0 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -412,6 +412,7 @@
 		{
 			extern double atof PROTO((const char *));
 			char buf[256];
+			double dx;
 			n = r_byte(p);
 			if (r_string(buf, (int)n, p) != n) {
 				err_setstr(EOFError,
@@ -419,7 +420,10 @@
 				return NULL;
 			}
 			buf[n] = '\0';
-			return newfloatobject(atof(buf));
+			PyFPE_START_PROTECT("atof", return 0)
+			dx = atof(buf);
+			PyFPE_END_PROTECT
+			return newfloatobject(dx);
 		}
 	
 #ifndef WITHOUT_COMPLEX
@@ -435,7 +439,9 @@
 				return NULL;
 			}
 			buf[n] = '\0';
+			PyFPE_START_PROTECT("atof", return 0)
 			c.real = atof(buf);
+			PyFPE_END_PROTECT
 			n = r_byte(p);
 			if (r_string(buf, (int)n, p) != n) {
 				err_setstr(EOFError,
@@ -443,7 +449,9 @@
 				return NULL;
 			}
 			buf[n] = '\0';
+			PyFPE_START_PROTECT("atof", return 0)
 			c.imag = atof(buf);
+			PyFPE_END_PROTECT
 			return newcomplexobject(c);
 		}
 #endif
diff --git a/Python/pyfpe.c b/Python/pyfpe.c
new file mode 100644
index 0000000..0b38997
--- /dev/null
+++ b/Python/pyfpe.c
@@ -0,0 +1,16 @@
+#include "config.h"
+#include "pyfpe.h"
+
+/* 
+ * The signal handler for SIGFPE is actually declared in an external
+ * module fpectl, or as preferred by the user.  These variable
+ * definitions are required in order to compile Python without
+ * getting missing externals, but to actually handle SIGFPE requires
+ * defining a handler and enabling generation of SIGFPE.
+ */
+
+#ifdef WANT_SIGFPE_HANDLER
+jmp_buf PyFPE_jbuf;
+int PyFPE_counter = 0;
+double PyFPE_dummy(void){return(1.0);}
+#endif