When raising a SyntaxError, make a best-effort attempt to set the
filename and lineno attributes, but do not mask the SyntaxError if we
fail.

This is part of what is needed to close SoruceForge bug #110628
(Jitterbug PR#278).

Wrap a long line to fit in under 80 columns.
diff --git a/Python/compile.c b/Python/compile.c
index 476f1f2..045f966 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -31,6 +31,7 @@
 #include "compile.h"
 #include "opcode.h"
 #include "structmember.h"
+#include "osdefs.h"			/* SEP */
 
 #include <ctype.h>
 #ifdef HAVE_LIMITS_H
@@ -304,8 +305,7 @@
 com_error(struct compiling *c, PyObject *exc, char *msg)
 {
 	size_t n = strlen(msg);
-	PyObject *v;
-	char buffer[30];
+	PyObject *v, *tb, *tmp;
 	char *s;
 	c->c_errors++;
 	if (c->c_lineno <= 1) {
@@ -313,15 +313,34 @@
 		PyErr_SetString(exc, msg);
 		return;
 	}
-	sprintf(buffer, " (line %d)", c->c_lineno);
-	v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
+	v = PyString_FromString(msg);
 	if (v == NULL)
 		return; /* MemoryError, too bad */
-	s = PyString_AS_STRING((PyStringObject *)v);
-	strcpy(s, msg);
-	strcat(s, buffer);
 	PyErr_SetObject(exc, v);
 	Py_DECREF(v);
+
+	/* add attributes for the line number and filename for the error */
+	PyErr_Fetch(&exc, &v, &tb);
+	PyErr_NormalizeException(&exc, &v, &tb);
+	tmp = PyInt_FromLong(c->c_lineno);
+	if (tmp == NULL)
+		PyErr_Clear();
+	else {
+		if (PyObject_SetAttrString(v, "lineno", tmp))
+			PyErr_Clear();
+		Py_DECREF(tmp);
+	}
+	if (c->c_filename != NULL) {
+		tmp = PyString_FromString(c->c_filename);
+		if (tmp == NULL)
+			PyErr_Clear();
+		else {
+			if (PyObject_SetAttrString(v, "filename", tmp))
+				PyErr_Clear();
+			Py_DECREF(tmp);
+		}
+	}
+	PyErr_Restore(exc, v, tb);
 }
 
 
@@ -1178,7 +1197,7 @@
 	if (NCH(n) == 1) {
 		if (*pkeywords != NULL) {
 			com_error(c, PyExc_SyntaxError,
-				   "non-keyword arg after keyword arg");
+				  "non-keyword arg after keyword arg");
 		}
 		else {
 			com_node(c, CHILD(n, 0));
@@ -2997,7 +3016,8 @@
 			c->c_errors++;
 		}
 		if (PyDict_GetItem(c->c_locals, nameval)) {
-			com_error(c, PyExc_SyntaxError,"duplicate argument in function definition");
+			com_error(c, PyExc_SyntaxError,
+				  "duplicate argument in function definition");
 		}
 		com_newlocal_o(c, nameval);
 		Py_DECREF(nameval);