Fix floating point division by zero in preprocessor expressions.

Closes #1183
diff --git a/CHANGES.current b/CHANGES.current
index 0618e97..e2072fd 100644
--- a/CHANGES.current
+++ b/CHANGES.current
@@ -7,6 +7,10 @@
 Version 4.0.0 (in progress)
 ===========================
 
+2018-01-15: wsfulton
+            Fix issue #1183. Floating point exception evaluating preprocessor expressions
+            resulting in division by zero.
+
 2018-01-14: wsfulton
             Fix issue #1172. Seg fault parsing invalid exponents in the preprocessor.
 
diff --git a/Examples/test-suite/errors/pp_expressions_bad.i b/Examples/test-suite/errors/pp_expressions_bad.i
new file mode 100644
index 0000000..8f7b3ab
--- /dev/null
+++ b/Examples/test-suite/errors/pp_expressions_bad.i
@@ -0,0 +1,13 @@
+%module xxx
+
+#define ZERO 0
+
+#if 1%ZERO
+#endif
+#if 2/ZERO
+#endif
+
+#if 1%(5-5)
+#endif
+#if 2/(55-55)
+#endif
diff --git a/Examples/test-suite/errors/pp_expressions_bad.stderr b/Examples/test-suite/errors/pp_expressions_bad.stderr
new file mode 100644
index 0000000..4f7aec5
--- /dev/null
+++ b/Examples/test-suite/errors/pp_expressions_bad.stderr
@@ -0,0 +1,8 @@
+pp_expressions_bad.i:5: Warning 202: Could not evaluate expression '1%ZERO'
+pp_expressions_bad.i:5: Warning 202: Error: 'Modulo by zero in expression'
+pp_expressions_bad.i:7: Warning 202: Could not evaluate expression '2/ZERO'
+pp_expressions_bad.i:7: Warning 202: Error: 'Division by zero in expression'
+pp_expressions_bad.i:10: Warning 202: Could not evaluate expression '1%(5-5)'
+pp_expressions_bad.i:10: Warning 202: Error: 'Modulo by zero in expression'
+pp_expressions_bad.i:12: Warning 202: Could not evaluate expression '2/(55-55)'
+pp_expressions_bad.i:12: Warning 202: Error: 'Division by zero in expression'
diff --git a/Source/Preprocessor/expr.c b/Source/Preprocessor/expr.c
index 6d22c8c..f6de7ef 100644
--- a/Source/Preprocessor/expr.c
+++ b/Source/Preprocessor/expr.c
@@ -188,12 +188,22 @@
       sp--;
       break;
     case SWIG_TOKEN_SLASH:
-      stack[sp - 2].value = stack[sp - 2].value / stack[sp].value;
-      sp -= 2;
+      if (stack[sp].value != 0) {
+	stack[sp - 2].value = stack[sp - 2].value / stack[sp].value;
+	sp -= 2;
+      } else {
+	errmsg = "Division by zero in expression";
+	return 0;
+      }
       break;
     case SWIG_TOKEN_PERCENT:
-      stack[sp - 2].value = stack[sp - 2].value % stack[sp].value;
-      sp -= 2;
+      if (stack[sp].value != 0) {
+	stack[sp - 2].value = stack[sp - 2].value % stack[sp].value;
+	sp -= 2;
+      } else {
+	errmsg = "Modulo by zero in expression";
+	return 0;
+      }
       break;
     case SWIG_TOKEN_LSHIFT:
       stack[sp - 2].value = stack[sp - 2].value << stack[sp].value;