Guest User

Untitled

a guest
Jul 16th, 2016
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.33 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3.  
  4.  
  5. #define MAXSTR 80
  6.  
  7. static int do_printf( int (*)( int), const char *, va_list);
  8. static void pr_int( unsigned long, int, char *);
  9.  
  10.  
  11. void
  12. printf( const char *fmt, ...) {
  13.     va_list args;
  14.  
  15.     va_start(args, fmt);
  16.     do_printf(putchar, fmt, args);
  17.     va_end(args);
  18. }
  19.  
  20. static int
  21. do_printf( int ( *func)(int), const char *fmt, va_list ap) {
  22.     int         i;
  23.     char        *str;
  24.     char        string[20];
  25.     int         length;
  26.     int         leftjust;
  27.     int         longflag;
  28.     int         fmax, fmin;
  29.     int         leading;
  30.     int         outcnt;
  31.     char        fill;
  32.     char        sign;
  33.  
  34.     outcnt = 0;
  35.     while ( ( i = *fmt++) != '\0') {
  36.         if ( i != '%') {
  37.             (*func)(i);
  38.             outcnt += 1;
  39.             continue;
  40.         }
  41.         if ( *fmt == '%') {
  42.             (*func)(*fmt++);
  43.             outcnt += 1;
  44.             continue;
  45.         }
  46.         leftjust = ( *fmt == '-');
  47.         if ( leftjust)
  48.             fmt++;
  49.         fill = ( *fmt == '0') ? *fmt++ : ' ';
  50.         if ( *fmt == '*')
  51.             fmin = va_arg(ap, int);
  52.         else {
  53.             fmin = 0;
  54.             while ( '0' <= *fmt && *fmt <= '9')
  55.                 fmin = fmin * 10 + *fmt++ - '0';
  56.         }
  57.         if ( *fmt != '.')
  58.             fmax = 0;
  59.         else {
  60.             fmt++;
  61.             if ( *fmt == '*')
  62.                 fmax = va_arg(ap, int);
  63.             else {
  64.                 fmax = 0;
  65.                 while ( '0' <= *fmt && *fmt <= '9')
  66.                     fmax = fmax * 10 + *fmt++ - '0';
  67.             }
  68.         }
  69.         longflag = ( *fmt == 'l');
  70.         if ( longflag)
  71.             fmt++;
  72.         if ( ( i = *fmt++) == '\0') {
  73.             ( *func)('%');
  74.             outcnt += 1;
  75.             break;
  76.         }
  77.         str = string;
  78.         sign = ' ';
  79.         switch (i) {
  80.         case 'c':
  81.             str[0] = va_arg( ap, int);
  82.             str[1] = '\0';
  83.             fmax = 0;
  84.             fill = ' ';
  85.             break;
  86.  
  87.         case 's':
  88.             str = va_arg( ap, char *);
  89.             fill = ' ';
  90.             break;
  91.  
  92.         case 'd':
  93.               {
  94.             long l = va_arg( ap, long);
  95.             if (l < 0) { sign = '-' ; l = -l; }
  96.             pr_int( ( unsigned long)l, 10, str);
  97.               }
  98.             break;
  99.  
  100.         case 'u':
  101.             pr_int( va_arg( ap, unsigned long), 10, str);
  102.             break;
  103.  
  104.         case 'o':
  105.             pr_int( va_arg( ap, unsigned long), 8, str);
  106.             fmax = 0;
  107.             break;
  108.  
  109.         case 'X':
  110.         case 'x':
  111.             pr_int( va_arg( ap, unsigned long), 16, str);
  112.             fmax = 0;
  113.             break;
  114.  
  115.         case 'p':
  116.             pr_int( va_arg( ap, unsigned long), 16, str);
  117.             fill = '0';
  118.             fmin = 8;
  119.             fmax = 0;
  120.             ( *func)('0'); ( *func)('x');
  121.             outcnt += 2;
  122.             break;
  123.         default:
  124.             ( *func)(i);
  125.             break;
  126.         }
  127.         for ( i = 0; str[i] != '\0'; i++) ;
  128.         length = i;
  129.         if ( fmin > MAXSTR || fmin < 0)
  130.             fmin = 0;
  131.         if ( fmax > MAXSTR || fmax < 0)
  132.             fmax = 0;
  133.         leading = 0;
  134.         if ( fmax != 0 || fmin != 0) {
  135.             if ( fmax != 0 && length > fmax)
  136.                 length = fmax;
  137.             if ( fmin != 0)
  138.                 leading = fmin - length;
  139.             if ( sign == '-')
  140.                 --leading;
  141.         }
  142.         outcnt += leading + length;
  143.         if ( sign == '-')
  144.             outcnt += 1;
  145.         if ( sign == '-' && fill == '0')
  146.             (*func)(sign);
  147.         if ( leftjust == 0)
  148.             for (i = 0; i < leading; i++) (*func)(fill);
  149.         if ( sign == '-' && fill == ' ')
  150.             (*func)(sign);
  151.         for ( i = 0; i < length; i++)
  152.             (*func)(str[i]);
  153.         if ( leftjust != 0)
  154.             for (i = 0; i < leading; i++) (*func)(fill);
  155.     }
  156.     return outcnt;
  157. }
  158.  
  159.  
  160. static void
  161. pr_int( unsigned long lval, int base, char *s) {
  162.     char                ptmp[12];   /* unsigned long requires 11 digit in octal form */
  163.     int                 i = 1;
  164.     char                *t = ptmp;
  165.     static const char   hexdigit[] = "0123456789abcdef";
  166.  
  167.     *t++ = '\0';
  168.     do {
  169.         *t++ = hexdigit[lval % base];
  170.     } while ( ( lval /= base) != 0 && ++i < sizeof( ptmp));
  171.  
  172.     while ( ( *s++ = *--t) != '\0')
  173.         ;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment