home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / contrib / usr.x25 / lib / print.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-03  |  1.7 KB  |  130 lines

  1.  
  2. /*
  3.  * Scaled down version of C Library printf and sprintf.
  4.  * Only %c %s %u %d (==%u) %o %D %O %x %X are recognized.
  5.  *
  6.  * Frank Pronk
  7.  * Copyright (c) 1983
  8.  */
  9.  
  10. static    char *lp;
  11.  
  12. char *
  13. sprint (buf, fmt, x1)
  14. char *buf, *fmt;
  15. unsigned x1;
  16. {
  17.     (void) doprint (buf, fmt, &x1);
  18. }
  19.  
  20. fprint (fd, fmt, x1)
  21. char *fmt;
  22. unsigned x1;
  23. {
  24.     register int n;
  25.     char line[128];
  26.  
  27.     n = doprint (line, fmt, &x1);
  28.     return (write (fd, line, n));
  29. }
  30.  
  31. print (fmt, x1)
  32. char *fmt;
  33. unsigned x1;
  34. {
  35.     register int n;
  36.     char line[128];
  37.  
  38.     n = doprint (line, fmt, &x1);
  39.     return (write (1, line, n));
  40. }
  41.  
  42. static
  43. doprint(buf, fmt, adx)
  44. char *buf;
  45. register char *fmt;
  46. register unsigned *adx;
  47. {
  48.     register c;
  49.     char *s;
  50.  
  51.     lp = buf;
  52. loop:
  53.     while((c = *fmt++) != '%') {
  54.         if(c == '\0') {
  55.             *lp = '\0';
  56.             return (lp - buf);
  57.         }
  58.         putchar(c);
  59.     }
  60.     switch(c = *fmt++) {
  61.     case 'c':
  62.         putchar((char)*adx);
  63.         break;
  64.  
  65.     case 'd':
  66.     case 'u':
  67.     case 'o':
  68.     case 'x':
  69.         itoa((unsigned long)*adx, c);
  70.         break;
  71.  
  72.     case 's':
  73.         s = (char *)*adx;
  74.         while(c = *s++)
  75.             putchar(c);
  76.         break;
  77.  
  78.     case 'D':
  79.     case 'O':
  80.     case 'X':
  81.         itoa(*(unsigned long *)adx, c);
  82.         adx += (sizeof(long) / sizeof(int)) - 1;
  83.         break;
  84.  
  85.     default:
  86.         putchar(c);
  87.     }
  88.     adx++;
  89.     goto loop;
  90. }
  91.  
  92. /*
  93.  * Print an unsigned integer in base base.
  94.  */
  95. itoa (n, base)
  96. register unsigned long n;
  97. register char base;
  98. {
  99.     char prbuf[11];
  100.     register int b;
  101.     register char *cp;
  102.  
  103.     if (base == 'o' || base == 'O')
  104.         b = 8;
  105.     else if (base == 'x' || base == 'X')
  106.         b = 16;
  107.     else
  108.         b = 10;
  109.     if (b == 10 && (int)n < 0) {
  110.         putchar('-');
  111.         n = (unsigned)(-(int)n);
  112.     }
  113.     cp = prbuf;
  114.     do {
  115.         *cp++ = "0123456789abcdef"[n%b];
  116.         n /= b;
  117.     } while (n);
  118.     do
  119.         putchar(*--cp);
  120.     while (cp > prbuf);
  121. }
  122.  
  123. static
  124. putchar(c)
  125. char c;
  126. {
  127. /*    if(lp < &line[128])*/
  128.         *lp++ = c;
  129. }
  130.