Advertisement
bueddl

Sample implementation of printf()

Oct 30th, 2015
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define NEXT(ptr, type) *((type*)ptr)++
  5.  
  6. void __print_int(int num)
  7. {
  8.     int digits = logl(num)/logl(10), digit;
  9.     int i;
  10.  
  11.     for (i = digits; i >= 0; --i) {
  12.         digit = (int)(num / powl(10, i)) % 10;
  13.         putchar('0' + digit);
  14.     }
  15. }
  16.  
  17. void __print_hex(int num)
  18. {
  19.     int digits = logl(num)/logl(16), digit;
  20.     int i;
  21.  
  22.     for (i = digits; i >= 0; --i) {
  23.         digit = (int)(num / powl(16, i)) % 16;
  24.         if (digit < 10)
  25.             putchar('0' + digit);
  26.         else
  27.             putchar('A' + digit - 10);
  28.     }
  29. }
  30.  
  31. void __print_str(char* str)
  32. {
  33.     while (*str)
  34.         putchar(*str++);
  35. }
  36.  
  37. void __print_char(char ch)
  38. {
  39.     putchar(ch);
  40. }
  41.  
  42. void my_printf(char* format, ...)
  43. {
  44.     void *stackptr = &format;
  45.     char specifier;
  46.    
  47.     NEXT(stackptr, char*);
  48.     while (*format) {
  49.         while (*format && *format != '%')
  50.             putchar(*format++);
  51.  
  52.         specifier = *++format;
  53.         format++;
  54.  
  55.         switch (specifier) {
  56.         case 'i':
  57.         case 'd':
  58.             __print_int(NEXT(stackptr, int));
  59.             break;
  60.  
  61.         case 'x':
  62.             __print_hex(NEXT(stackptr, int));
  63.             break;
  64.        
  65.         case 's':
  66.             __print_str(NEXT(stackptr, char*));
  67.             break;
  68.        
  69.         case 'c':
  70.             __print_char(NEXT(stackptr, char));
  71.             break;
  72.         }
  73.     }
  74. }
  75.  
  76. void main(void)
  77. {
  78.     my_printf("Das ist ein %s mit %d variablen und es wurden %d erwartet (Hier noch eine hex zahl %x) %c\n", "Test", 5, 5, 127, '!');
  79.  
  80.     my_printf("Das ist ein %s mit %d variablen, aber es wurden %d erwartet (Hier noch eine hex zahl %x) %c\n", "Test", 4, 5, 127);
  81.  
  82.     return;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement