console.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <stddef.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <stdarg.h>
  6. #include "common.h"
  7. #include "console.h"
  8. #include "io.h"
  9. #if CON_OUT_OF_LINE
  10. void __hot con_putc(char c)
  11. {
  12. _con_putc(c);
  13. }
  14. void __hot con_puts(const char *str)
  15. {
  16. _con_puts(str);
  17. }
  18. #endif
  19. void con_vprintf(const char *fmt, va_list ap)
  20. {
  21. char buf[128]; /* Maximum text size */
  22. unsigned int len;
  23. const char *p;
  24. vsnprintf(buf, sizeof buf, fmt, ap);
  25. con_puts(buf);
  26. }
  27. void con_printf(const char *fmt, ...)
  28. {
  29. va_list ap;
  30. va_start(ap, fmt);
  31. con_vprintf(fmt, ap);
  32. va_end(ap);
  33. }
  34. void con_hexdump(const void *data, size_t len)
  35. {
  36. const uint8_t *p = data;
  37. if (!len)
  38. return;
  39. while (1) {
  40. con_printf("%p", p);
  41. for (size_t i = 0; i < 16; i++) {
  42. if (!(i & 7))
  43. con_putc(' ');
  44. if (i >= len)
  45. con_puts(" ");
  46. else
  47. con_printf(" %02x", p[i]);
  48. }
  49. con_puts(" |");
  50. for (size_t i = 0; i < 16; i++) {
  51. char c;
  52. if (i >= len)
  53. break;
  54. c = p[i];
  55. if (c < ' ' || c > '~')
  56. c = '.';
  57. con_putc(c);
  58. }
  59. con_puts("|\n");
  60. if (len <= 16)
  61. break;
  62. p += 16;
  63. len -= 16;
  64. }
  65. }