From 7169dbb76dcd1d25f2989eb00da33d05c3d6279b Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 26 Feb 1992 15:17:59 +0000 Subject: Move printing of filename and lineno to tb_displayline. Search sys.path if the filename isn't found. Include osdefs.h. --- Python/traceback.c | 65 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 20 deletions(-) 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 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #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 @@ tb_displayline(fp, filename, lineno) 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 @@ tb_printinternal(tb, fp) 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); -- cgit v0.12