printf.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <stdarg.h> /* va_list, va_arg() */
  2. #include <stdio.h>
  3. #include "do_printf.h"
  4. /*****************************************************************************
  5. * PRINTF You must write your own putchar()
  6. *****************************************************************************/
  7. static int vprintf_help(unsigned c, void **ptr){
  8. ptr = ptr; /* to avoid unused varible warning */
  9. putchar(c);
  10. return 0;
  11. }
  12. static int vsprintf_help(unsigned int c, void **ptr){
  13. char *dst = *ptr;
  14. *dst++ = c;
  15. *ptr = dst;
  16. return 0 ;
  17. }
  18. __attribute__((used))
  19. int vsprintf(char *buffer, const char *fmt, va_list args){
  20. int ret_val = do_printf(fmt, args, vsprintf_help, (void *)buffer);
  21. buffer[ret_val] = '\0';
  22. return ret_val;
  23. }
  24. __attribute__((used))
  25. int sprintf(char *buffer, const char *fmt, ...){
  26. va_list args;
  27. int ret_val;
  28. va_start(args, fmt);
  29. ret_val = vsprintf(buffer, fmt, args);
  30. va_end(args);
  31. return ret_val;
  32. }
  33. __attribute__((used))
  34. int vprintf(const char *fmt, va_list args){
  35. return do_printf(fmt, args, vprintf_help, (void *)0);
  36. }
  37. __attribute__((used))
  38. int printf(const char *fmt, ...){
  39. va_list args;
  40. int ret_val;
  41. va_start(args, fmt);
  42. ret_val = vprintf(fmt, args);
  43. va_end(args);
  44. return ret_val;
  45. }