home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / vbcc / machines / amiga68k / libsrc / stdio / old / _printf.c next >
Encoding:
C/C++ Source or Header  |  1998-06-24  |  4.9 KB  |  147 lines

  1. #include <stdio.h>
  2. #include <limits.h>
  3. #include <stdarg.h>
  4.  
  5. int _printf(void *,int (),const char *,va_list);
  6. int _sputc(int,char *);
  7. int _printul(void *out,int putfunc(),unsigned long val,int min,int max,int flags,int base);
  8. int _printsl(void *out,int putfunc(),long val,int min,int max,int flags);
  9.  
  10. int _printf(void *out,int putfunc(),const char *fmt,va_list vl)
  11. /*  die eigentliche printf-Routine; out ist ein Zeiger auf entweder ein */
  12. /*  FILE oder einen String und putfunc() ein Zeiger auf eine Funktion,  */
  13. /*  die ein Zeichen ausgibt                                             */
  14. {
  15.     int k,n=0;
  16.     while(k=*fmt){
  17.         if(k=='%'){
  18.             int min=0,max=INT_MAX,flags=0,i;
  19.             char *str;long l;unsigned long ul;int base=0;
  20.             k=*++fmt;
  21.             if(k=='-'){flags|=1;k=*++fmt;}
  22.             while(k>='0'&&k<='9'){
  23.                 min=min*10+k-'0';
  24.                 k=*++fmt;
  25.             }
  26.             if(k=='.'){
  27.                 k=*++fmt;max=0;
  28.                 while(k>='0'&&k<='9'){
  29.                     max=max*10+k-'0';
  30.                     k=*++fmt;
  31.                 }
  32.             }
  33.             if(k=='h'){flags|=2;k=*++fmt;}
  34.             if(k=='l'){flags|=4;k=*++fmt;}
  35.             fmt++;
  36.             switch(k){
  37.                 default:
  38.                 case '%':
  39.                             putfunc(k,out);n++;break;
  40.                 case 'c':
  41.                             if(min>1&&!(flags&1)) for(i=0;i<min-1;i++) putfunc(' ',out);
  42.                             putfunc(va_arg(vl,int),out);
  43.                             if(min>1&&(flags&1)) for(i=0;i<min-1;i++) putfunc(' ',out);
  44.                             if(min>1) n+=min; else n+=1;
  45.                             break;
  46.                 case 's':
  47.                             str=va_arg(vl,char *);
  48.                             ul=strlen(str);
  49.                             if(ul>=max){
  50.                                 for(i=0;i<max;i++) putfunc(*str++,out);
  51.                                 n+=max;
  52.                                 break;
  53.                             }
  54.                             if(ul<min&&!(flags&1)) for(i=0;i<min-ul;i++) putfunc(' ',out);
  55.                             while(*str) putfunc(*str++,out);
  56.                             if(ul<min&&(flags&1)) for(i=0;i<min-ul;i++) putfunc(' ',out);
  57.                             if(min>ul) n+=min; else n+=ul;
  58.                             break;
  59.                 case 'p':
  60.                 case 'x':
  61.                 case 'X':
  62.                             if(!base) base=16;
  63.                 case 'o':
  64.                             if(!base) base=8;
  65.                 case 'u':
  66.                             if(!base) base=10;
  67.                             if(flags&2) ul=va_arg(vl,unsigned short);
  68.                             else{
  69.                                 if(flags&4) ul=va_arg(vl,unsigned long);
  70.                                 else ul=va_arg(vl,unsigned int);
  71.                             }
  72.                             n+=_printul(out,putfunc,ul,min,max,flags,base);
  73.                             break;
  74.                 case 'i':
  75.                 case 'd':
  76.                             if(flags&2) l=va_arg(vl,short);
  77.                             else{
  78.                                 if(flags&4) l=va_arg(vl,long);
  79.                                 else l=va_arg(vl,int);
  80.                             }
  81.                             n+=_printsl(out,putfunc,l,min,max,flags);
  82.                             break;
  83.  
  84.             }
  85.         }else{
  86.             putfunc(k,out);
  87.             n++;fmt++;
  88.         }
  89.     }
  90.     return(n);
  91. }
  92. int _printul(void *out,int putfunc(),unsigned long val,int min,int max,int flags,int base)
  93. {
  94.     static char dig[]="0123456789abcdef";
  95.     char buf[20],*p=buf;   /*  lang hoffentlich immer  */
  96.     int n,i;
  97.     if(!val){*p++='0';
  98.     }else{
  99.         while(val){
  100.             *p++=dig[val%base];
  101.             val/=base;
  102.         }
  103.     }
  104.     n=p-buf;
  105.     if(n>=max){
  106.         for(i=0;i<max;i++) putfunc(*--p,out);
  107.         return(max);
  108.     }else{
  109.         if(min>n&&!(flags&1)) for(i=0;i<min-n;i++) putfunc(' ',out);
  110.         for(i=0;i<n;i++) putfunc(*--p,out);
  111.         if(min>n&&(flags&1)) for(i=0;i<min-n;i++) putfunc(' ',out);
  112.         if(n>min) return(n); else return(min);
  113.     }
  114. }
  115. int _printsl(void *out,int putfunc(),long val,int min,int max,int flags)
  116. {
  117.     char buf[20],*p=buf;   /*  lang hoffentlich immer  */
  118.     int n,i;unsigned long uval;
  119.     if(val>=0){ uval=val;i=0;
  120.     }else{
  121.         uval=0;i=1;
  122.         while(val<-LONG_MAX){
  123.             uval+=LONG_MAX;
  124.             val+=LONG_MAX;
  125.         }
  126.         uval+=(-val);
  127.     }
  128.     if(!uval){*p++='0';
  129.     }else{
  130.         while(uval){
  131.             *p++=uval%10+'0';
  132.             uval/=10;
  133.         }
  134.         if(i) *p++='-';
  135.     }
  136.     n=p-buf;
  137.     if(n>=max){
  138.         for(i=0;i<max;i++) putfunc(*--p,out);
  139.         return(max);
  140.     }else{
  141.         if(min>n&&!(flags&1)) for(i=0;i<min-n;i++) putfunc(' ',out);
  142.         for(i=0;i<n;i++) putfunc(*--p,out);
  143.         if(min>n&&(flags&1)) for(i=0;i<min-n;i++) putfunc(' ',out);
  144.         if(n>min) return(n); else return(min);
  145.     }
  146. }
  147.