Advertisement
Madmouse

printf stuff

Nov 25th, 2015
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.95 KB | None | 0 0
  1. #define lambda(type, body) ({ type lambda body lambda; })
  2. const char* format_flags = "scixb";
  3. char* (*printf_fun_array[sizeof(format_flags)]) (void*);
  4.  
  5. void init_printf()
  6. {
  7.      typeof(*printf_fun_array) a[] = {
  8.         lambda(char*, (void* p){ return p; }),
  9.         lambda(char*, (void* p){ return ((char[]) { (char) p, NULL }); }),
  10.         lambda(char*, (void* p){ return itoa((long int) p, 10, true); }),
  11.         lambda(char*, (void* p){
  12.                 char* i = itoa((long int) p, 16, false);
  13.                 char* out = malloc(strlen(i)+3);
  14.                 memcpy(out, "0x", 3);
  15.                 strcat(out, i);
  16.                 return out;
  17.             }),
  18.         lambda(char*, (void* p){
  19.                 char* i = itoa((long int) p, 2, false);
  20.                 char* out = malloc(strlen(i)+3);
  21.                 memcpy(out, "0b", 3);
  22.                 strcat(out, i);
  23.                 return out;
  24.             }),
  25.         NULL
  26.     };
  27.     memcpy(printf_fun_array, a, sizeof(a));
  28. }
  29.  
  30.  
  31. int sprintf(char* str, const char* __restrict format, ...)
  32. {
  33.     va_list argp;
  34.     void* p;
  35.     int i, c, ccount;
  36.     va_start(argp, format);
  37.     for(i = 0;format[i] != NULL;i++)
  38.     {
  39.         switch(format[i])
  40.         {
  41.             case '%':
  42.                 i++;
  43.                 if(cpos(format_flags, format[i]) != -1)
  44.                 {
  45.                     p = (void*) va_arg(argp, void*);
  46.                     char* out = printf_fun_array[cpos(format_flags, format[i])](p);
  47.                     for(c = 0;out[c] != NULL;c++, ccount++)
  48.                          str[ccount] = out[c];
  49.                 }
  50.                 else
  51.                 {
  52.                     str[ccount] = format[i];
  53.                     ccount++;
  54.                 }
  55.                 continue;
  56.             default:
  57.                 str[ccount] = format[i];
  58.                 ccount++;
  59.                 continue;
  60.         }
  61.     }
  62.     va_end(argp);
  63.     str[ccount] = NULL;
  64.     return ccount;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement