home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / adb / format.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  4.5 KB  |  272 lines

  1. #
  2. /*
  3.  *
  4.  *    UNIX debugger
  5.  *
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10.  
  11. MSG        BADMOD;
  12. MSG        NOFORK;
  13. MSG        ADWRAP;
  14.  
  15. SYMTAB        symbol;
  16.  
  17. INT        mkfault;
  18. CHAR        *lp;
  19. INT        maxoff;
  20. INT        sigint;
  21. INT        sigqit;
  22. STRING        errflg;
  23. CHAR        lastc;
  24. L_INT        dot;
  25. INT        dotinc;
  26. L_INT        var[];
  27.  
  28.  
  29. scanform(icount,ifp,itype,ptype)
  30. L_INT        icount;
  31. STRING        ifp;
  32. {
  33.     STRING        fp;
  34.     CHAR        modifier;
  35.     INT        fcount, init=1;
  36.     L_INT        savdot;
  37.  
  38.     WHILE icount
  39.     DO  fp=ifp;
  40.         IF init==0 ANDF findsym(shorten(dot),ptype)==0 ANDF maxoff
  41.         THEN printf("\n%.8s:%16t",symbol.symc);
  42.         FI
  43.         savdot=dot; init=0;
  44.  
  45.         /*now loop over format*/
  46.         WHILE *fp ANDF errflg==0
  47.         DO  IF digit(modifier = *fp)
  48.         THEN fcount=0;
  49.              WHILE digit(modifier = *fp++)
  50.              DO fcount *= 10;
  51.             fcount += modifier-'0';
  52.              OD
  53.              fp--;
  54.         ELSE fcount=1;
  55.         FI
  56.  
  57.         IF *fp==0 THEN break; FI
  58.         fp=exform(fcount,fp,itype,ptype);
  59.         OD
  60.         dotinc=dot-savdot;
  61.         dot=savdot;
  62.  
  63.         IF errflg
  64.         THEN IF icount<0
  65.          THEN errflg=0; break;
  66.          ELSE error(errflg);
  67.          FI
  68.         FI
  69.         IF --icount
  70.         THEN dot=inkdot(dotinc);
  71.         FI
  72.         IF mkfault THEN error(0); FI
  73.     OD
  74. }
  75.  
  76. STRING    exform(fcount,ifp,itype,ptype)
  77. INT        fcount;
  78. STRING        ifp;
  79. {
  80.     /* execute single format item `fcount' times
  81.      * sets `dotinc' and moves `dot'
  82.      * returns address of next format item
  83.      */
  84.     POS        w;
  85.     L_INT        savdot, wx;
  86.     STRING        fp;
  87.     CHAR        c, modifier, longpr;
  88.     L_REAL        fw;
  89.     struct{
  90.         L_INT    sa;
  91.         INT    sb,sc;
  92.     };
  93.  
  94.     WHILE fcount>0
  95.     DO    fp = ifp; c = *fp;
  96.         longpr=(c>='A')&(c<='Z')|(c=='f');
  97.         IF itype==NSP ORF *fp=='a'
  98.         THEN wx=dot; w=dot;
  99.         ELSE w=get(dot,itype);
  100.              IF longpr
  101.              THEN wx=itol(w,get(inkdot(2),itype));
  102.              ELSE wx=w;
  103.              FI
  104.         FI
  105.         IF c=='F'
  106.         THEN fw.sb=get(inkdot(4),itype);
  107.              fw.sc=get(inkdot(6),itype);
  108.         FI
  109.         IF errflg THEN return(fp); FI
  110.         IF mkfault THEN error(0); FI
  111.         var[0]=wx;
  112.         modifier = *fp++;
  113.         dotinc=(longpr?4:2);;
  114.  
  115.         IF charpos()==0 ANDF modifier!='a' THEN printf("%16m"); FI
  116.  
  117.         switch(modifier) {
  118.  
  119.             case SP: case TB:
  120.             break;
  121.  
  122.             case 't': case 'T':
  123.             printf("%T",fcount); return(fp);
  124.  
  125.             case 'r': case 'R':
  126.             printf("%M",fcount); return(fp);
  127.  
  128.             case 'a':
  129.             psymoff(dot,ptype,":%16t"); dotinc=0; break;
  130.  
  131.             case 'p':
  132.             psymoff(var[0],ptype,"%16t"); break;
  133.  
  134.             case 'u':
  135.             printf("%-8u",w); break;
  136.  
  137.             case 'U':
  138.             printf("%-16U",wx); break;
  139.  
  140.             case 'c': case 'C':
  141.             IF modifier=='C'
  142.             THEN printesc(w&LOBYTE);
  143.             ELSE printc(w&LOBYTE);
  144.             FI
  145.             dotinc=1; break;
  146.  
  147.             case 'b': case 'B':
  148.             printf("%-8o", w&LOBYTE); dotinc=1; break;
  149.  
  150.             case 's': case 'S':
  151.             savdot=dot; dotinc=1;
  152.             WHILE (c=get(dot,itype)&LOBYTE) ANDF errflg==0
  153.             DO dot=inkdot(1);
  154.                IF modifier == 'S'
  155.                THEN printesc(c);
  156.                ELSE printc(c);
  157.                FI
  158.                endline();
  159.             OD
  160.             dotinc=dot-savdot+1; dot=savdot; break;
  161.  
  162.             case 'x':
  163.             printf("%-8x",w); break;
  164.  
  165.             case 'X':
  166.             printf("%-16X", wx); break;
  167.  
  168.             case 'Y':
  169.             printf("%-24Y", wx); break;
  170.  
  171.             case 'q':
  172.             printf("%-8q", w); break;
  173.  
  174.             case 'Q':
  175.             printf("%-16Q", wx); break;
  176.  
  177.             case 'o':
  178.             case 'w':
  179.             printf("%-8o", w); break;
  180.  
  181.             case 'O':
  182.             case 'W':
  183.             printf("%-16O", wx); break;
  184.  
  185.             case 'i':
  186.             printins(0,itype,w); printc(EOR); break;
  187.  
  188.             case 'd':
  189.             printf("%-8d", w); break;
  190.  
  191.             case 'D':
  192.             printf("%-16D", wx); break;
  193.  
  194.             case 'f':
  195.             fw = 0;
  196.             fw.sa = wx;
  197.             printf("%-16.9f", fw);
  198.             dotinc=4; break;
  199.  
  200.             case 'F':
  201.             fw.sa = wx;
  202.             printf("%-32.18F", fw);
  203.             dotinc=8; break;
  204.  
  205.             case 'n': case 'N':
  206.             printc('\n'); dotinc=0; break;
  207.  
  208.             case '"':
  209.             dotinc=0;
  210.             WHILE *fp != '"' ANDF *fp
  211.             DO printc(*fp++); OD
  212.             IF *fp THEN fp++; FI
  213.             break;
  214.  
  215.             case '^':
  216.             dot=inkdot(-dotinc*fcount); return(fp);
  217.  
  218.             case '+':
  219.             dot=inkdot(fcount); return(fp);
  220.  
  221.             case '-':
  222.             dot=inkdot(-fcount); return(fp);
  223.  
  224.             default: error(BADMOD);
  225.         }
  226.         IF itype!=NSP
  227.         THEN    dot=inkdot(dotinc);
  228.         FI
  229.         fcount--; endline();
  230.     OD
  231.  
  232.     return(fp);
  233. }
  234.  
  235. unox()
  236. {
  237.     INT        rc, status, unixpid;
  238.     STRING        argp lp;
  239.  
  240.     WHILE lastc!=EOR DO rdc(); OD
  241.     IF (unixpid=fork())==0
  242.     THEN    signal(SIGINT,sigint); signal(SIGQUIT,sigqit);
  243.         *lp=0; execl("/bin/sh", "sh", "-c", argp, 0);
  244.         exit(16);
  245.     ELIF unixpid == -1
  246.     THEN    error(NOFORK);
  247.     ELSE    signal(SIGINT,1);
  248.         WHILE (rc = wait(&status)) != unixpid ANDF rc != -1 DONE
  249.         signal(SIGINT,sigint);
  250.         prints("!"); lp--;
  251.     FI
  252. }
  253.  
  254.  
  255. printesc(c)
  256. {
  257.     c &= STRIP;
  258.     IF c<SP ORF c>'~' ORF c=='@'
  259.     THEN printf("@%c",(c=='@' ? '@' : c^0140));
  260.     ELSE printc(c);
  261.     FI
  262. }
  263.  
  264. L_INT    inkdot(incr)
  265. {
  266.     L_INT        newdot;
  267.  
  268.     newdot=dot+incr;
  269.     IF (dot NEQ newdot) >> 24 THEN error(ADWRAP); FI
  270.     return(newdot);
  271. }
  272.