home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / standalone / prf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-03  |  2.9 KB  |  187 lines

  1.  
  2. /*
  3.  * Scaled down version of C Library printf.
  4.  * Only %s %u %d (==%u) %o %x %D are recognized.
  5.  * Used to print diagnostic information
  6.  * directly on console tty.
  7.  * Since it is not interrupt driven,
  8.  * all system activities are pretty much
  9.  * suspended.
  10.  * Printf should not be used for chit-chat.
  11.  */
  12. printf(fmt, x1)
  13. register char *fmt;
  14. unsigned x1;
  15. {
  16.     register c;
  17.     register unsigned int *adx;
  18.     char *s;
  19.  
  20.     adx = &x1;
  21. loop:
  22.     while((c = *fmt++) != '%') {
  23.         if(c == '\0')
  24.             return;
  25.         putchar(c);
  26.     }
  27.     c = *fmt++;
  28.     if(c == 'd' || c == 'u' || c == 'o' || c == 'x')
  29.         printn((long)*adx, c=='o'? 8: (c=='x'? 16:10));
  30.     else if(c == 's') {
  31.         s = (char *)*adx;
  32.         while(c = *s++)
  33.             putchar(c);
  34.     } else if (c == 'D') {
  35.         printn(*(long *)adx, 10);
  36.         adx += (sizeof(long) / sizeof(int)) - 1;
  37.     } else if (c == 'c')
  38.         putchar((char *)*adx);
  39.     adx++;
  40.     goto loop;
  41. }
  42.  
  43. /*
  44.  * Print an unsigned integer in base b.
  45.  */
  46. printn(n, b)
  47. long n;
  48. {
  49.     register long a;
  50.  
  51.     if (n<0) {    /* shouldn't happen */
  52.         putchar('-');
  53.         n = -n;
  54.     }
  55.     if(a = n/b)
  56.         printn(a, b);
  57.     putchar("0123456789ABCDEF"[(int)(n%b)]);
  58. }
  59.  
  60.  
  61.  
  62. struct    device    {
  63.     int    rcsr,rbuf;
  64.     int    tcsr,tbuf;
  65. };
  66.  
  67. /* Modifications below allow use of KL11 units 0 and 1 - wkt */
  68.  
  69. struct    device    *KLADDR[2]= {0177560, 0176500};
  70.  
  71. putchar(c)
  72. register c;
  73. { putc(c,0); }
  74.  
  75. putc(c,unit)
  76. register c;
  77. register unit;
  78. {
  79.     register s;
  80.     register unsigned timo;
  81.  
  82.     if (unit>1) unit=0;
  83.     /*
  84.      *  If last char was a break or null, don't print
  85.     if ((KLADDR[unit]->rbuf&0177) == 0)
  86.         return;
  87.     */
  88.     timo = 60000;
  89.     /*
  90.      * Try waiting for the console tty to come ready,
  91.      * otherwise give up after a reasonable time.
  92.      */
  93.     while((KLADDR[unit]->tcsr&0200) == 0)
  94.         if(--timo == 0)
  95.             break;
  96.     if ((unit == 0) && (c == 0)) return;    /* Ignore NULLs on console */
  97.     s = KLADDR[unit]->tcsr;
  98.     KLADDR[unit]->tcsr = 0;
  99.     KLADDR[unit]->tbuf = c;
  100.     if (unit==0) {                /* Translate chars on console */
  101.        if (c == '\n') {
  102.         putc('\r',0);
  103.         putc(0177,0);
  104.         putc(0177,0);
  105.        }
  106.        putc(0,0);
  107.         }
  108.     KLADDR[unit]->tcsr = s;
  109. }
  110.  
  111. getchar()
  112. { return(newgetc(0)); }
  113.  
  114. newgetc(unit)
  115. register unit;
  116. {
  117.     register c;
  118.  
  119.     KLADDR[unit]->rcsr = 1;
  120.     while((KLADDR[unit]->rcsr&0200)==0);
  121.     c = KLADDR[unit]->rbuf&0177;
  122.     if (unit==0) {
  123.        if (c=='\r')
  124.         c = '\n';
  125.        putc(c,unit);    /* Only echo on console */
  126.      }
  127.     return(c);
  128. }
  129.  
  130. gets(buf)
  131. char    *buf;
  132. {
  133. register char *lp;
  134. register c;
  135.  
  136.     lp = buf;
  137.     for (;;) {
  138.         c = getchar() & 0177;
  139.         if (c>='A' && c<='Z')
  140.             c -= 'A' - 'a';
  141.         if (lp != buf && *(lp-1) == '\\') {
  142.             lp--;
  143.             if (c>='a' && c<='z') {
  144.                 c += 'A' - 'a';
  145.                 goto store;
  146.             }
  147.             switch ( c) {
  148.             case '(':
  149.                 c = '{';
  150.                 break;
  151.             case ')':
  152.                 c = '}';
  153.                 break;
  154.             case '!':
  155.                 c = '|';
  156.                 break;
  157.             case '^':
  158.                 c = '~';
  159.                 break;
  160.             case '\'':
  161.                 c = '`';
  162.                 break;
  163.             }
  164.         }
  165.     store:
  166.         switch(c) {
  167.         case '\n':
  168.         case '\r':
  169.             c = '\n';
  170.             *lp++ = '\0';
  171.             return;
  172.         case '\b':
  173.         case '#':
  174.             lp--;
  175.             if (lp < buf)
  176.                 lp = buf;
  177.             continue;
  178.         case '@':
  179.             lp = buf;
  180.             putchar('\n');
  181.             continue;
  182.         default:
  183.             *lp++ = c;
  184.         }
  185.     }
  186. }
  187.