[BACK]Return to debug.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / parse

Annotation of OpenXM_contrib2/asir2000/parse/debug.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/parse/debug.c,v 1.2 1999/11/18 05:42:02 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "parse.h"
        !             4: #include <ctype.h>
        !             5: #include "genpari.h"
        !             6:
        !             7: void show_stack(VS);
        !             8: void change_stack(int,NODE *);
        !             9: void showpos(void);
        !            10: void printvars(char *,VS);
        !            11: void println(int,char **,int);
        !            12: void bp(SNODE);
        !            13: void searchsn(SNODE *,int,SNODE **);
        !            14: void showbp(int);
        !            15: void showbps(void);
        !            16: void delbp(int,char **);
        !            17: int searchbp(void);
        !            18: void clearbp(FUNC);
        !            19: void settp(char *);
        !            20: void setbp(char *);
        !            21: void setf(int,char **);
        !            22: void show_alias(char *);
        !            23: void add_alias(char *,char *);
        !            24:
        !            25: extern do_server_in_X11,do_file;
        !            26:
        !            27: typedef enum {
        !            28:        D_NEXT, D_STEP, D_FINISH, D_CONT, D_QUIT,
        !            29:        D_UP, D_DOWN, D_FRAME,
        !            30:        D_LIST, D_PRINT,
        !            31:        D_SETF, D_SETBP, D_SETTP, D_DELBP,
        !            32:        D_SHOWBP, D_WHERE, D_ALIAS, D_UNKNOWN
        !            33: } did;
        !            34:
        !            35: struct oDEBCOM {
        !            36:        NODE names;
        !            37:        did id;
        !            38: };
        !            39:
        !            40: int nextbp,nextbplevel;
        !            41: FUNC cur_binf;
        !            42:
        !            43: static FUNC targetf;
        !            44: static int curline = 1;
        !            45:
        !            46: extern NODE PVSS;
        !            47: extern unsigned int evalstatline;
        !            48: extern int debug_mode;
        !            49: extern jmp_buf debug_env;
        !            50:
        !            51: char *debcom[] = {
        !            52:        "next",
        !            53:        "step",
        !            54:        "finish",
        !            55:        "cont",
        !            56:        "quit",
        !            57:        "up",
        !            58:        "down",
        !            59:        "frame",
        !            60:        "list",
        !            61:        "print",
        !            62:        "func",
        !            63:        "stop",
        !            64:        "trace",
        !            65:        "delete",
        !            66:        "status",
        !            67:        "where",
        !            68:        "alias",
        !            69: };
        !            70:
        !            71: struct oDEBCOM dckwd[] = {
        !            72:        {0, D_NEXT},
        !            73:        {0, D_STEP},
        !            74:        {0, D_FINISH},
        !            75:        {0, D_CONT},
        !            76:        {0, D_QUIT},
        !            77:        {0, D_UP},
        !            78:        {0, D_DOWN},
        !            79:        {0, D_FRAME},
        !            80:        {0, D_LIST},
        !            81:        {0, D_PRINT},
        !            82:        {0, D_SETF},
        !            83:        {0, D_SETBP},
        !            84:        {0, D_SETTP},
        !            85:        {0, D_DELBP},
        !            86:        {0, D_SHOWBP},
        !            87:        {0, D_WHERE},
        !            88:        {0, D_ALIAS},
        !            89:        {0, D_UNKNOWN}
        !            90: };
        !            91:
        !            92: void debug_init() {
        !            93:        int i,n,ac;
        !            94:        char *home;
        !            95:        char buf[BUFSIZ+1];
        !            96: #if defined(__MWERKS__)
        !            97:        char *av[64];
        !            98: #else
        !            99:        char *av[BUFSIZ];
        !           100: #endif
        !           101:        FILE *fp;
        !           102:
        !           103:        for ( n = 0; dckwd[n].id != D_UNKNOWN; n++ );
        !           104:        for ( i = 0; i < n; i++ )
        !           105:                MKNODE(dckwd[i].names,debcom[i],0);
        !           106: #if defined(THINK_C)
        !           107:        strcpy(buf,"dbxinit");
        !           108: #else
        !           109:        home = (char *)getenv("HOME");
        !           110:        if ( home )
        !           111:                strcpy(buf,home);
        !           112:        else
        !           113:                buf[0] = 0;
        !           114:        strcat(buf,"/.dbxinit");
        !           115: #endif
        !           116:        if ( (fp = fopen(".dbxinit","r")) || (fp = fopen(buf,"r")) ) {
        !           117:                while ( fgets(buf,BUFSIZ,fp) ) {
        !           118:                        stoarg(buf,&ac,av);
        !           119:                        if ((ac == 3) && !strcmp(av[0],"alias"))
        !           120:                                add_alias(av[2],av[1]);
        !           121:                }
        !           122:                fclose(fp);
        !           123:        }
        !           124: #if !defined(VISUAL)
        !           125:        if ( do_server_in_X11 )
        !           126:                init_cmdwin();
        !           127: #endif
        !           128: }
        !           129:
        !           130: void add_alias(com,alias)
        !           131: char *com,*alias;
        !           132: {
        !           133:        int i;
        !           134:        NODE tn;
        !           135:        char *s;
        !           136:
        !           137:        for ( i = 0; dckwd[i].names; i++ )
        !           138:                if (!strcmp(com,debcom[i])) {
        !           139:                        for ( tn = dckwd[i].names; NEXT(tn); tn = NEXT(tn) );
        !           140:                        s = (char *)MALLOC(strlen(alias)+1); strcpy(s,alias);
        !           141:                        MKNODE(NEXT(tn),s,0);
        !           142:                        return;
        !           143:                }
        !           144: }
        !           145:
        !           146: void show_alias(alias)
        !           147: char *alias;
        !           148: {
        !           149:        int i;
        !           150:        NODE tn;
        !           151:
        !           152:        if ( !alias )
        !           153:                for ( i = 0; dckwd[i].names; i++ ) {
        !           154:                        if ( tn = NEXT(dckwd[i].names) )
        !           155:                                fprintf(stderr,"%s\t",debcom[i]);
        !           156:                        for ( ; tn; tn = NEXT(tn) ) {
        !           157:                                fputs(BDY(tn),stderr);
        !           158:                                if ( NEXT(tn) )
        !           159:                                        fputc(' ',stderr);
        !           160:                                else
        !           161:                                        fputc('\n',stderr);
        !           162:                        }
        !           163:                }
        !           164:        else
        !           165:                for ( i = 0; dckwd[i].names; i++ )
        !           166:                        for ( tn = dckwd[i].names; tn; tn = NEXT(tn) )
        !           167:                                if ( !strcmp(alias,BDY(tn)) ) {
        !           168:                                        fprintf(stderr,"%s->%s\n",alias,debcom[i]); return;
        !           169:                                }
        !           170: }
        !           171:
        !           172: void debug(f)
        !           173: SNODE f;
        !           174: {
        !           175:        int ac,i,n;
        !           176:        did id;
        !           177: #if defined(__MWERKS__)
        !           178:        char *av[64];
        !           179: #else
        !           180:        char *av[BUFSIZ];
        !           181: #endif
        !           182:        char buf[BUFSIZ];
        !           183:        char prompt[BUFSIZ];
        !           184:        char *p,*pe;
        !           185:        NODE tn;
        !           186:        extern int kernelmode,do_fep;
        !           187:        NODE pvss;
        !           188:
        !           189: #if !defined(VISUAL)
        !           190:        if ( !isatty(fileno(stdin)) && !do_server_in_X11 )
        !           191:                if ( do_file )
        !           192:                        ExitAsir();
        !           193:                else
        !           194:                        return;
        !           195: #endif
        !           196: #if defined(VISUAL) || defined(THINK_C)
        !           197:        suspend_timer();
        !           198: #endif
        !           199:        pvss = PVSS; debug_mode = 1;
        !           200: #if !defined(VISUAL)
        !           201:        if ( do_server_in_X11 )
        !           202: #endif
        !           203:                show_debug_window(1);
        !           204:        sprintf(prompt,"(debug)%c",kernelmode?0xfe:' ');
        !           205:        if ( kernelmode )
        !           206:                fputc('\0',stderr);
        !           207:        setjmp(debug_env);
        !           208:        while ( 1 ) {
        !           209:                if ( !do_server_in_X11 )
        !           210:                        fputs(prompt,stderr);
        !           211:                bzero(buf,BUFSIZ);
        !           212:                while ( 1 ) {
        !           213:                        {
        !           214:                                int len;
        !           215:
        !           216: #if !defined(VISUAL)
        !           217:                                if ( do_server_in_X11 )
        !           218:                                        get_line(buf);
        !           219:                                else
        !           220: #endif
        !           221:                                if ( !fgets(buf,BUFSIZ,stdin) )
        !           222:                                        goto LAST;
        !           223:                                len = strlen(buf);
        !           224:                                if ( buf[len-1] == '\n' )
        !           225:                                        buf[len-1] = 0;
        !           226:                        }
        !           227:                        for ( p = buf; *p && isspace(*p); p++ );
        !           228:                        if ( *p )
        !           229:                                break;
        !           230:                }
        !           231:                for ( pe = p; *pe && !isspace(*pe); pe++ );
        !           232:                *pe = 0;
        !           233:                for ( i = 0; dckwd[i].names; i++ ) {
        !           234:                        for ( tn = dckwd[i].names; tn; tn = NEXT(tn) )
        !           235:                                if ( !strcmp(BDY(tn),p) )
        !           236:                                        break;
        !           237:                        if ( tn )
        !           238:                                break;
        !           239:                }
        !           240:                id = dckwd[i].id; p = pe+1;
        !           241:                switch ( id ) {
        !           242:                        case D_NEXT:
        !           243:                                if ( f ) { nextbp = 1; nextbplevel = 0; }
        !           244:                                goto LAST; break;
        !           245:                        case D_STEP:
        !           246:                                if ( f ) { nextbp = 1; nextbplevel = -1; }
        !           247:                                goto LAST; break;
        !           248:                        case D_FINISH:
        !           249:                                if ( f ) { nextbp = 1; nextbplevel = 1; }
        !           250:                                goto LAST; break;
        !           251:                        case D_CONT: case D_QUIT:
        !           252:                                goto LAST; break;
        !           253:                        case D_UP:
        !           254:                                if ( f ) {
        !           255:                                        stoarg(p,&ac,av); n = ac ? atoi(av[0]) : 1;
        !           256:                                        change_stack(n,&pvss);
        !           257:                                }
        !           258:                                break;
        !           259:                        case D_DOWN:
        !           260:                                if ( f ) {
        !           261:                                        stoarg(p,&ac,av); n = ac ? atoi(av[0]) : 1;
        !           262:                                        change_stack(-n,&pvss);
        !           263:                                }
        !           264:                                break;
        !           265:                        case D_FRAME:
        !           266:                                if ( f ) {
        !           267:                                        stoarg(p,&ac,av);
        !           268:                                        if ( !ac )
        !           269:                                                show_stack((VS)BDY(pvss));
        !           270:                                        else {
        !           271:                                                n = atoi(av[0]);
        !           272:                                                change_stack(((VS)BDY(pvss))->level-((VS)BDY(PVSS))->level+n,&pvss);
        !           273:                                        }
        !           274:                                }
        !           275:                                break;
        !           276:                        case D_PRINT:
        !           277:                                printvars(p,pvss?(VS)BDY(pvss):GPVS); break;
        !           278:                        case D_LIST:
        !           279:                                stoarg(p,&ac,av); println(ac,av,10); break;
        !           280:                        case D_SETF:
        !           281:                                stoarg(p,&ac,av); setf(ac,av); break;
        !           282:                        case D_SETBP:
        !           283:                                setbp(p); break;
        !           284:                        case D_SETTP:
        !           285:                                settp(p); break;
        !           286:                        case D_DELBP:
        !           287:                                stoarg(p,&ac,av); delbp(ac,av); break;
        !           288:                        case D_SHOWBP:
        !           289:                                showbps(); break;
        !           290:                        case D_WHERE:
        !           291:                                showpos(); break;
        !           292:                        case D_ALIAS:
        !           293:                                stoarg(p,&ac,av);
        !           294:                                switch ( ac ) {
        !           295:                                        case 0:
        !           296:                                                show_alias(0); break;
        !           297:                                        case 1:
        !           298:                                                show_alias(av[0]); break;
        !           299:                                        case 2: default:
        !           300:                                                add_alias(av[1],av[0]); break;
        !           301:                                }
        !           302:                                break;
        !           303:                        default:
        !           304:                                break;
        !           305:                }
        !           306:        }
        !           307: LAST:
        !           308:        if ( kernelmode )
        !           309:                fputc('\0',stderr);
        !           310:        debug_mode = 0;
        !           311: #if defined(THINK_C)
        !           312:        show_debug_window(0);
        !           313:        resume_timer();
        !           314: #elif !defined(VISUAL)
        !           315:        if ( do_server_in_X11 )
        !           316: #endif
        !           317:                show_debug_window(0);
        !           318: }
        !           319:
        !           320: void setf(ac,av)
        !           321: int ac;
        !           322: char **av;
        !           323: {
        !           324:        FUNC r;
        !           325:
        !           326:        if ( !ac )
        !           327:                return;
        !           328:        searchf(usrf,av[0],&r);
        !           329:        if ( r ) {
        !           330:                targetf = r;
        !           331:                curline = targetf->f.usrf->startl;
        !           332:        }
        !           333: }
        !           334:
        !           335: #define MAXBP 64
        !           336:
        !           337: static struct {
        !           338:        int at;
        !           339:        FUNC f;
        !           340:        SNODE *snp;
        !           341:        char *texpr;
        !           342:        char *cond;
        !           343: } bpt[MAXBP];
        !           344:
        !           345: static int bpindex = 0;
        !           346:
        !           347: void setbp(p)
        !           348: char *p;
        !           349: {
        !           350:        int ac;
        !           351:        char *av[BUFSIZ];
        !           352:        char *buf,*savp;
        !           353:        char *fname;
        !           354:        FUNC r;
        !           355:        USRF t;
        !           356:        SNODE *snp = 0;
        !           357:        FNODE cond;
        !           358:        NODE tn;
        !           359:        int n,at,ln,bpi;
        !           360:
        !           361:        buf = (char *)ALLOCA(strlen(p)+1); strcpy(buf,p); stoarg(buf,&ac,av);
        !           362:        if ( ac < 2 )
        !           363:                return;
        !           364:        if ( !strcmp(av[0],"at") ) {
        !           365:                if ( !targetf )
        !           366:                        return;
        !           367:                n = atoi(av[1]); fname = targetf->f.usrf->fname;
        !           368:                for ( tn = usrf; tn; tn = NEXT(tn) ) {
        !           369:                        r = (FUNC)BDY(tn); t = r->f.usrf;
        !           370:                        if ( t && t->fname && !strcmp(t->fname,fname)
        !           371:                                && ( t->startl <= n ) && ( n <= t->endl ) )
        !           372:                                break;
        !           373:                }
        !           374:                if ( !r ) {
        !           375:                        fprintf(stderr,"no such line in %s\n",fname);
        !           376:                        return;
        !           377:                } else {
        !           378:                        targetf = r; curline = n;
        !           379:                }
        !           380:                at = 1; searchsn(&BDY(t),n,&snp);
        !           381:        } else if ( !strcmp(av[0],"in") ) {
        !           382:                searchf(usrf,av[1],&r);
        !           383:                if ( !r ) {
        !           384:                        fprintf(stderr,"%s() : no such function\n",av[1]);
        !           385:                        return;
        !           386:                } else if ( r->id == A_UNDEF ) {
        !           387:                        fprintf(stderr,"%s : undefined\n",av[1]);
        !           388:                        return;
        !           389:                }
        !           390:                for ( tn = (NODE)FA0(BDY(r->f.usrf)); tn && !BDY(tn); tn = NEXT(tn) );
        !           391:                if ( tn ) {
        !           392:                        snp = (SNODE *)&(BDY(tn)); at = 0; targetf = r; curline = (*snp)->ln;
        !           393:                }
        !           394:        } else
        !           395:                return;
        !           396:        if ( snp ) {
        !           397:                cond = 0;
        !           398:                if ( ac >= 3 && !strncmp(av[2],"if",2) ) {
        !           399:                        savp = p+(av[2]-buf)+2;
        !           400:                        exprparse(targetf,savp,&cond);
        !           401:                }
        !           402:                bpi = searchbp();
        !           403:                if ( bpi < 0 )
        !           404:                        fprintf(stderr,"too many breakpoints\n");
        !           405:                else if ( ID(*snp) == S_BP )
        !           406:                        return;
        !           407:                else {
        !           408:                        switch ( ID(*snp) ) {
        !           409:                                case S_IFELSE: case S_FOR: case S_DO:
        !           410:                                        ln = (int)FA0(*snp); break;
        !           411:                                default:
        !           412:                                        ln = (*snp)->ln; break;
        !           413:                        }
        !           414:                        *snp = (SNODE)mksnode(3,S_BP,*snp,cond,0);
        !           415:                        (*snp)->ln = ln;
        !           416:                        if ( cond ) {
        !           417:                                bpt[bpi].cond = (char *)MALLOC(strlen(savp)+1);
        !           418:                                strcpy(bpt[bpi].cond,savp);
        !           419:                        } else
        !           420:                                bpt[bpi].cond = 0;
        !           421:                        bpt[bpi].at = at;
        !           422:                        bpt[bpi].f = targetf;
        !           423:                        bpt[bpi].snp = snp;
        !           424:                        bpt[bpi].texpr = 0;
        !           425:                        showbp(bpi);
        !           426:                }
        !           427:        }
        !           428: }
        !           429:
        !           430: void settp(p)
        !           431: char *p;
        !           432: {
        !           433:        int ac;
        !           434:        char *_av[BUFSIZ];
        !           435:        char **av;
        !           436:        char *buf,*savp;
        !           437:        char *fname;
        !           438:        char *texprname;
        !           439:        FUNC r;
        !           440:        USRF t;
        !           441:        SNODE *snp = 0;
        !           442:        FNODE cond,texpr;
        !           443:        NODE tn;
        !           444:        int n,at,ln,bpi;
        !           445:
        !           446:        av = _av;
        !           447:        buf = (char *)ALLOCA(strlen(p)+1); strcpy(buf,p); stoarg(buf,&ac,av);
        !           448:        if ( ac < 3 )
        !           449:                return;
        !           450:        texprname = av[0]; ac--; av++;
        !           451:        if ( !strcmp(av[0],"at") ) {
        !           452:                if ( !targetf )
        !           453:                        return;
        !           454:                n = atoi(av[1]); fname = targetf->f.usrf->fname;
        !           455:                for ( tn = usrf; tn; tn = NEXT(tn) ) {
        !           456:                        r = (FUNC)BDY(tn); t = r->f.usrf;
        !           457:                        if ( t && t->fname && !strcmp(t->fname,fname)
        !           458:                                && ( t->startl <= n ) && ( n <= t->endl ) )
        !           459:                                break;
        !           460:                }
        !           461:                if ( !r ) {
        !           462:                        fprintf(stderr,"no such line in %s\n",fname);
        !           463:                        return;
        !           464:                } else {
        !           465:                        targetf = r; curline = n;
        !           466:                }
        !           467:                at = 1; searchsn(&BDY(t),n,&snp);
        !           468:        } else if ( !strcmp(av[0],"in") ) {
        !           469:                searchf(usrf,av[1],&r);
        !           470:                if ( !r ) {
        !           471:                        fprintf(stderr,"%s() : no such function\n",av[1]);
        !           472:                        return;
        !           473:                }
        !           474:                for ( tn = (NODE)FA0(BDY(r->f.usrf)); tn && !BDY(tn); tn = NEXT(tn) );
        !           475:                if ( tn ) {
        !           476:                        snp = (SNODE *)&(BDY(tn)); at = 0; targetf = r; curline = (*snp)->ln;
        !           477:                }
        !           478:        } else
        !           479:                return;
        !           480:        if ( snp ) {
        !           481:                cond = 0;
        !           482:                exprparse(targetf,texprname,&texpr);
        !           483:                if ( ac >= 3 && !strncmp(av[2],"if",2) ) {
        !           484:                        savp = p+(av[2]-buf)+2;
        !           485:                        exprparse(targetf,savp,&cond);
        !           486:                }
        !           487:                bpi = searchbp();
        !           488:                if ( bpi < 0 )
        !           489:                        fprintf(stderr,"too many breakpoints\n");
        !           490:                else if ( ID(*snp) == S_BP )
        !           491:                        return;
        !           492:                else {
        !           493:                        switch ( ID(*snp) ) {
        !           494:                                case S_IFELSE: case S_FOR: case S_DO:
        !           495:                                        ln = (int)FA0(*snp); break;
        !           496:                                default:
        !           497:                                        ln = (*snp)->ln; break;
        !           498:                        }
        !           499:                        *snp = (SNODE)mksnode(3,S_BP,*snp,cond,texpr);
        !           500:                        (*snp)->ln = ln;
        !           501:                        if ( cond ) {
        !           502:                                bpt[bpi].cond = (char *)MALLOC(strlen(savp)+1);
        !           503:                                strcpy(bpt[bpi].cond,savp);
        !           504:                        } else
        !           505:                                bpt[bpi].cond = 0;
        !           506:                        bpt[bpi].at = at;
        !           507:                        bpt[bpi].f = targetf;
        !           508:                        bpt[bpi].snp = snp;
        !           509:                        bpt[bpi].texpr = (char *)MALLOC(strlen(texprname)+1);
        !           510:                        strcpy(bpt[bpi].texpr,texprname);
        !           511:                        showbp(bpi);
        !           512:                }
        !           513:        }
        !           514: }
        !           515:
        !           516: void clearbp(f)
        !           517: FUNC f;
        !           518: {
        !           519:        int i;
        !           520:
        !           521:        if ( !f )
        !           522:                return;
        !           523:        for ( i = 0; i < bpindex; i++ )
        !           524:        if ( bpt[i].snp && !strcmp(f->name,bpt[i].f->name) ) {
        !           525:                bpt[i].at = 0; bpt[i].f = 0; bpt[i].snp = 0;
        !           526:        }
        !           527: }
        !           528:
        !           529: int searchbp()
        !           530: {
        !           531:        int i;
        !           532:
        !           533:        for ( i = 0; i < bpindex; i++ )
        !           534:                if ( !bpt[i].snp )
        !           535:                        return i;
        !           536:        if ( bpindex == MAXBP )
        !           537:                return -1;
        !           538:        else
        !           539:                return bpindex++;
        !           540: }
        !           541:
        !           542: void delbp(ac,av)
        !           543: int ac;
        !           544: char **av;
        !           545: {
        !           546:        int n;
        !           547:
        !           548:        if ( !ac )
        !           549:                return;
        !           550:        if ( (n = atoi(av[0])) >= bpindex )
        !           551:                return;
        !           552:        if ( bpt[n].snp ) {
        !           553:                *bpt[n].snp = (SNODE)FA0(*bpt[n].snp);
        !           554:                bpt[n].snp = 0;
        !           555:        }
        !           556: }
        !           557:
        !           558: void showbps() {
        !           559:        int i;
        !           560:
        !           561:        for ( i = 0; i < bpindex; i++ )
        !           562:                showbp(i);
        !           563: }
        !           564:
        !           565: void showbp(n)
        !           566: int n;
        !           567: {
        !           568:        if ( bpt[n].snp )
        !           569:                if ( bpt[n].texpr )
        !           570:                        if ( bpt[n].at ) {
        !           571:                                if ( bpt[n].cond )
        !           572:                                        fprintf(stderr,"(%d) trace %s at \"%s\":%d if %s\n",
        !           573:                                                n,bpt[n].texpr,bpt[n].f->f.usrf->fname,(*bpt[n].snp)->ln,bpt[n].cond);
        !           574:                                else
        !           575:                                        fprintf(stderr,"(%d) trace %s at \"%s\":%d\n",
        !           576:                                                n,bpt[n].texpr,bpt[n].f->f.usrf->fname,(*bpt[n].snp)->ln);
        !           577:                        } else {
        !           578:                                if ( bpt[n].cond )
        !           579:                                        fprintf(stderr,"(%d) trace %s in %s if %s\n",
        !           580:                                                n,bpt[n].texpr,bpt[n].f->name,bpt[n].cond);
        !           581:                                else
        !           582:                                        fprintf(stderr,"(%d) trace %s in %s\n",n,bpt[n].texpr,bpt[n].f->name);
        !           583:                        }
        !           584:                else
        !           585:                        if ( bpt[n].at ) {
        !           586:                                if ( bpt[n].cond )
        !           587:                                        fprintf(stderr,"(%d) stop at \"%s\":%d if %s\n",
        !           588:                                                n,bpt[n].f->f.usrf->fname,(*bpt[n].snp)->ln,bpt[n].cond);
        !           589:                                else
        !           590:                                        fprintf(stderr,"(%d) stop at \"%s\":%d\n",
        !           591:                                                n,bpt[n].f->f.usrf->fname,(*bpt[n].snp)->ln);
        !           592:                        } else {
        !           593:                                if ( bpt[n].cond )
        !           594:                                        fprintf(stderr,"(%d) stop in %s if %s\n",
        !           595:                                                n,bpt[n].f->name,bpt[n].cond);
        !           596:                                else
        !           597:                                        fprintf(stderr,"(%d) stop in %s\n",n,bpt[n].f->name);
        !           598:                        }
        !           599: }
        !           600:
        !           601: void searchsn(fp,n,fpp)
        !           602: SNODE *fp;
        !           603: int n;
        !           604: SNODE **fpp;
        !           605: {
        !           606:        NODE tn;
        !           607:        SNODE sn;
        !           608:        SNODE *snp;
        !           609:
        !           610:        *fpp = 0;
        !           611:        switch (ID(*fp)) {
        !           612:                case S_CPLX:
        !           613:                        for ( tn = (NODE)FA0(*fp); tn; tn = NEXT(tn) )
        !           614:                                if ( sn = (SNODE)BDY(tn) ) {
        !           615:                                        snp = (SNODE *)(ID(sn) == S_BP ? &FA0(sn) : &BDY(tn));
        !           616:                                        if ( (*snp)->ln >= n ) {
        !           617:                                                searchsn(snp,n,fpp); break;
        !           618:                                        }
        !           619:                                }
        !           620:                        break;
        !           621:                case S_IFELSE:
        !           622:                        if ( n <= (int)FA0(*fp) )
        !           623:                                *fpp = fp;
        !           624:                        else if ( n <= ((SNODE)FA2(*fp))->ln )
        !           625:                                searchsn((SNODE *)&FA2(*fp),n,fpp);
        !           626:                        else if ( FA3(*fp) )
        !           627:                                searchsn((SNODE *)&FA3(*fp),n,fpp);
        !           628:                        if ( !(*fpp) )
        !           629:                                *fpp = fp;
        !           630:                        break;
        !           631:                case S_FOR:
        !           632:                        if ( n <= (int)FA0(*fp) )
        !           633:                                *fpp = fp;
        !           634:                        else
        !           635:                                searchsn((SNODE *)&FA4(*fp),n,fpp);
        !           636:                        if ( !(*fpp) )
        !           637:                                *fpp = fp;
        !           638:                        break;
        !           639:                case S_DO:
        !           640:                        if ( n <= (int)FA0(*fp) )
        !           641:                                *fpp = fp;
        !           642:                        else
        !           643:                                searchsn((SNODE *)&FA1(*fp),n,fpp);
        !           644:                        if ( !(*fpp) )
        !           645:                                *fpp = fp;
        !           646:                        break;
        !           647:                case S_BP:
        !           648:                        switch ( ID((SNODE)FA0(*fp)) ) {
        !           649:                                case S_SINGLE:
        !           650:                                        *fpp = fp; break;
        !           651:                                default:
        !           652:                                        searchsn((SNODE *)&FA0(*fp),n,fpp); break;
        !           653:                        }
        !           654:                        break;
        !           655:                case S_SINGLE: default:
        !           656:                        *fpp = fp;
        !           657:                        break;
        !           658:        }
        !           659: }
        !           660:
        !           661: void bp(f)
        !           662: SNODE f;
        !           663: {
        !           664:        int ln;
        !           665:
        !           666:        if ( !f || (CPVS == GPVS) )
        !           667:                return;
        !           668:
        !           669:        switch ( ID(f) ) {
        !           670:                case S_IFELSE: case S_FOR:
        !           671:                        ln = (int)FA0(f); break;
        !           672:                default:
        !           673:                        ln = f->ln; break;
        !           674:        }
        !           675: #if !defined(VISUAL)
        !           676:        if ( do_server_in_X11 )
        !           677: #endif
        !           678:                show_debug_window(1);
        !           679:        fprintf(stderr,"stopped in %s at line %d in file \"%s\"\n",
        !           680:                CPVS->usrf->name,ln,CPVS->usrf->f.usrf->fname);
        !           681:        targetf = CPVS->usrf; curline = ln;
        !           682:        println(0,0,1);
        !           683: #if !defined(VISUAL)
        !           684:        if ( do_server_in_X11 || isatty(0) )
        !           685: #endif
        !           686:                debug(f);
        !           687: }
        !           688:
        !           689: void println(ac,av,l)
        !           690: int ac;
        !           691: char **av;
        !           692: int l;
        !           693: {
        !           694:        FILE *fp;
        !           695:        char buf[BUFSIZ+1];
        !           696:        int i;
        !           697:        int ln;
        !           698:        FUNC r;
        !           699: #if defined(THINK_C)
        !           700:        void setDir(short);
        !           701: #endif
        !           702:
        !           703:        if ( !ac )
        !           704:                ln = curline;
        !           705:        else if ( isdigit(av[0][0]) )
        !           706:                ln = atoi(av[0]);
        !           707:        else {
        !           708:                searchf(usrf,av[0],&r);
        !           709:                if ( r && r->id != A_UNDEF ) {
        !           710:                        targetf = r;
        !           711:                        ln = r->f.usrf->startl;
        !           712:                } else {
        !           713:                        fprintf(stderr,"%s undefined\n",av[0]);
        !           714:                        ln = curline;
        !           715:                }
        !           716:        }
        !           717:        if ( !targetf )
        !           718:                return;
        !           719: #if defined(THINK_C)
        !           720:        setDir(targetf->f.usrf->vol);
        !           721: #endif
        !           722:        fp = fopen(targetf->f.usrf->fname,"r");
        !           723: #if defined(THINK_C)
        !           724:        resetDir();
        !           725: #endif
        !           726:        if ( !fp ) {
        !           727:                fprintf(stderr,"\"%s\" not found\n",targetf->name);
        !           728:                return;
        !           729:        }
        !           730:        for ( i = 1; i < ln; i++ )
        !           731:                if ( !fgets(buf,BUFSIZ,fp) )
        !           732:                        return;
        !           733:        for ( i = 0; i < l; i++ ) {
        !           734:                if ( !fgets(buf,BUFSIZ,fp) )
        !           735:                        break;
        !           736:                fprintf(stderr,"%d      %s",ln+i,buf);
        !           737:        }
        !           738:        curline = ln + i;
        !           739:        fclose(fp);
        !           740: }
        !           741:
        !           742: void printvars(s,vs)
        !           743: char *s;
        !           744: VS vs;
        !           745: {
        !           746:        FNODE expr;
        !           747:        char *p;
        !           748:        pointer val = 0;
        !           749:        int err;
        !           750:        VS cpvs;
        !           751:
        !           752:        for ( p = s; *p; p++ )
        !           753:                if ( *p == '\n' ) {
        !           754:                        *p = 0; break;
        !           755:                }
        !           756:        if ( exprparse(vs==GPVS?0:vs->usrf,s,&expr) ) {
        !           757:                cpvs = CPVS; CPVS = vs;
        !           758:                if ( !(err = setjmp(debug_env)) )
        !           759:                        val = eval(expr);
        !           760:                CPVS = cpvs;
        !           761:                if ( !err ) {
        !           762: #if PARI
        !           763: #if PARI1
        !           764:                        outfile = stderr;
        !           765: #else
        !           766:                        pari_outfile = stderr;
        !           767: #endif
        !           768: #endif
        !           769:                        asir_out = stderr;
        !           770:                        for ( p = s; isspace(*p); p++ );
        !           771:                        fprintf(asir_out,"%s = ",p);
        !           772:                        if ( val && ID((R)val) == O_MAT )
        !           773:                                putc('\n',asir_out);
        !           774: #if defined(VISUAL_LIB)
        !           775:                        w_noflush_stderr(1);
        !           776: #endif
        !           777:                        printexpr(CO,val); putc('\n',asir_out); fflush(asir_out);
        !           778: #if defined(VISUAL_LIB)
        !           779:                        w_noflush_stderr(0);
        !           780: #endif
        !           781: #if PARI
        !           782: #if PARI1
        !           783:                        outfile = stdout;
        !           784: #else
        !           785:                        pari_outfile = stdout;
        !           786: #endif
        !           787: #endif
        !           788:                        asir_out = stdout;
        !           789:                }
        !           790:        }
        !           791: }
        !           792:
        !           793: void showpos()
        !           794: {
        !           795:        NODE n;
        !           796:        VS vs;
        !           797:        int level;
        !           798:
        !           799:        if ( PVSS ) {
        !           800:                if ( cur_binf )
        !           801:                        fprintf(stderr,"%s() (builtin)\n",cur_binf->name);
        !           802:                ((VS)BDY(PVSS))->at = evalstatline;
        !           803:                level = ((VS)BDY(PVSS))->level;
        !           804:                for ( n = PVSS; n; n = NEXT(n) ) {
        !           805:                        vs = (VS)BDY(n);
        !           806:                        fprintf(stderr,"#%d %s(), line %d in \"%s\"\n",
        !           807:                                level-vs->level,vs->usrf->name,vs->at,vs->usrf->f.usrf->fname);
        !           808:                }
        !           809:        }
        !           810: }
        !           811:
        !           812: void showpos_to_string(buf)
        !           813: char *buf;
        !           814: {
        !           815:        NODE n;
        !           816:        VS vs;
        !           817:        int level;
        !           818:
        !           819:        buf[0] = 0;
        !           820:        if ( PVSS ) {
        !           821:                if ( cur_binf )
        !           822:                        sprintf(buf,"%s() (builtin)\n",cur_binf->name);
        !           823:                buf += strlen(buf);
        !           824:                ((VS)BDY(PVSS))->at = evalstatline;
        !           825:                level = ((VS)BDY(PVSS))->level;
        !           826:                for ( n = PVSS; n; n = NEXT(n) ) {
        !           827:                        vs = (VS)BDY(n);
        !           828:                        sprintf(buf,"#%d %s(), line %d in \"%s\"\n",
        !           829:                                level-vs->level,vs->usrf->name,vs->at,vs->usrf->f.usrf->fname);
        !           830:                        buf += strlen(buf);
        !           831:                }
        !           832:        }
        !           833: }
        !           834:
        !           835: void change_stack(level,pvss)
        !           836: int level;
        !           837: NODE *pvss;
        !           838: {
        !           839:        extern NODE PVSS;
        !           840:        NODE n;
        !           841:        int i;
        !           842:        VS vs;
        !           843:
        !           844:        if ( !level || !PVSS )
        !           845:                return;
        !           846:        if ( level < 0 ) {
        !           847:                for ( n = PVSS, i = 0; n && n != *pvss; n = NEXT(n), i++ );
        !           848:                for ( n = PVSS, i = MAX(i+level,0); n && i; n = NEXT(n), i-- );
        !           849:        } else
        !           850:                for ( n = *pvss, i = level; NEXT(n) && i; n = NEXT(n), i-- );
        !           851:        *pvss = n; vs = (VS)BDY(n);
        !           852:        ((VS)BDY(PVSS))->at = evalstatline;
        !           853:        show_stack(vs);
        !           854:        targetf = vs->usrf; curline = vs->at;
        !           855: }
        !           856:
        !           857: void show_stack(vs)
        !           858: VS vs;
        !           859: {
        !           860:        fprintf(stderr,"#%d %s(), line %d in \"%s\"\n",
        !           861:                ((VS)BDY(PVSS))->level-vs->level,vs->usrf->name,vs->at,vs->usrf->f.usrf->fname);
        !           862: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>