Move printing of filename and lineno to tb_displayline.
Search sys.path if the filename isn't found.
Include osdefs.h.
diff --git a/Python/traceback.c b/Python/traceback.c
index bcec490..ea99152 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -26,10 +26,12 @@
 
 #include "allobjects.h"
 
+#include "sysmodule.h"
 #include "compile.h"
 #include "frameobject.h"
 #include "traceback.h"
 #include "structmember.h"
+#include "osdefs.h"
 
 typedef struct _tracebackobject {
 	OB_HEAD
@@ -154,21 +156,56 @@
 	int lineno;
 {
 	FILE *xfp;
-	char buf[1000];
+	char linebuf[1000];
 	int i;
-	if (filename[0] == '<' && filename[strlen(filename)-1] == '>')
-		return;
 	xfp = fopen(filename, "r");
 	if (xfp == NULL) {
-		fprintf(fp, "    (cannot open \"%s\")\n", filename);
-		return;
+		/* Search tail of filename in sys.path before giving up */
+		object *path;
+		char *tail = strrchr(filename, SEP);
+		if (tail == NULL)
+			tail = filename;
+		else
+			tail++;
+		path = sysget("path");
+		if (path != NULL && is_listobject(path)) {
+			int npath = getlistsize(path);
+			char namebuf[MAXPATHLEN+1];
+			for (i = 0; i < npath; i++) {
+				object *v = getlistitem(path, i);
+				if (is_stringobject(v)) {
+					int len;
+					strcpy(namebuf, getstringvalue(v));
+					len = getstringsize(v);
+					if (len > 0 && namebuf[len-1] != SEP)
+						namebuf[len++] = SEP;
+					strcpy(namebuf+len, tail);
+					xfp = fopen(namebuf, "r");
+					if (xfp != NULL) {
+						filename = namebuf;
+						break;
+					}
+				}
+			}
+		}
 	}
+	fprintf(fp, "  File \"%s\"", filename);
+#ifdef applec /* MPW */
+	/* This is needed by MPW's File and Line commands */
+	fprintf(fp, "; ");
+#else
+	/* This is needed by Emacs' compile command */
+	fprintf(fp, ", ");
+#endif
+	fprintf(fp, "line %d\n", lineno);
+	if (xfp == NULL)
+		return;
 	for (i = 0; i < lineno; i++) {
-		if (fgets(buf, sizeof buf, xfp) == NULL)
+		if (fgets(linebuf, sizeof linebuf, xfp) == NULL)
 			break;
 	}
 	if (i == lineno) {
-		char *p = buf;
+		char *p = linebuf;
 		while (*p == ' ' || *p == '\t')
 			p++;
 		fprintf(fp, "    %s", p);
@@ -183,19 +220,7 @@
 	tracebackobject *tb;
 	FILE *fp;
 {
-	while (tb != NULL) {
-		if (intrcheck())
-			break;
-		fprintf(fp, "  File \"%s\"",
-			getstringvalue(tb->tb_frame->f_code->co_filename));
-#ifdef applec /* MPW */
-		/* This is needed by MPW's File and Line commands */
-		fprintf(fp, "; ");
-#else
-		/* This is needed by Emacs' compile command */
-		fprintf(fp, ", ");
-#endif
-		fprintf(fp, "line %d\n", tb->tb_lineno);
+	while (tb != NULL && !intrcheck()) {
 		tb_displayline(fp,
 		     getstringvalue(tb->tb_frame->f_code->co_filename),
 							tb->tb_lineno);