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>