fmtint64.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include <format.h>
  2. /* Format 64-bit integers. Since 64-bit arches will pass shorted
  3. integers in registers anyway, alias fmt32 to theese as well. */
  4. static char* fmtint64(char* buf, char* end, int minus, uint64_t num)
  5. {
  6. int len = 0;
  7. uint64_t n;
  8. for(len = 1, n = num; n >= 10; len++)
  9. n /= 10;
  10. int i;
  11. char* e = buf + len + minus;
  12. char* p = e - 1; /* len >= 1 so e > buf */
  13. for(i = 0; i < len; i++, p--, num /= 10)
  14. if(p < end)
  15. *p = '0' + num % 10;
  16. if(minus) *p = '-';
  17. return e > end ? end : e;
  18. }
  19. char* fmti64(char* buf, char* end, int64_t num)
  20. {
  21. return fmtint64(buf, end, num < 0, num < 0 ? -num : num);
  22. }
  23. char* fmtu64(char* buf, char* end, uint64_t num)
  24. {
  25. return fmtint64(buf, end, 0, num);
  26. }
  27. #if BITS == 64
  28. char* fmti32(char* buf, char* end, int32_t num)
  29. {
  30. return fmtint64(buf, end, num < 0, num < 0 ? -num : num);
  31. }
  32. char* fmtu32(char* buf, char* end, uint32_t num)
  33. {
  34. return fmtint64(buf, end, 0, num);
  35. }
  36. char* fmtlong(char* buf, char* end, long num)
  37. __attribute__((alias("fmti64")));
  38. char* fmtulong(char* buf, char* end, unsigned long num)
  39. __attribute__((alias("fmtu64")));
  40. char* fmtint(char* buf, char* end, int num)
  41. __attribute__((alias("fmti32")));
  42. char* fmtuint(char* buf, char* end, unsigned num)
  43. __attribute__((alias("fmtu32")));
  44. #endif