Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.11 KB | None | 0 0
  1. // SPDX-License-Identifier: Apache-2.0
  2. // Copyright 2019 Charles University
  3.  
  4. #include <adt/list.h>
  5. #include <debug.h>
  6. #include <drivers/printer.h>
  7. #include <lib/print.h>
  8. #include <lib/stdarg.h>
  9. #include <types.h>
  10.  
  11. static void puts_on_line(const char* s) {
  12. while (*s != '\0') {
  13. printer_putchar(*s);
  14. s++;
  15. }
  16. }
  17.  
  18. /** Prints given string to console, terminating it with newline.
  19. *
  20. * @param s String to print.
  21. */
  22. void puts(const char* s) {
  23. puts_on_line(s);
  24. printer_putchar('\n');
  25. }
  26.  
  27. static int abs(int n) {
  28. if (n < 0) {
  29. return -n;
  30. }
  31.  
  32. return n;
  33. }
  34.  
  35. static void printHex(unsigned int n, int konstant) {
  36. const int numberOffset = 48;
  37. const int maxLength = 8;
  38. int digits[maxLength];
  39. for (int i = 0; i < maxLength; ++i) {
  40. digits[i] = n % 16;
  41. n /= 16;
  42. }
  43.  
  44. int first = 0;
  45. int offset = numberOffset;
  46. for (int j = maxLength - 1; j > 0; --j) {
  47. if (first == 1 || digits[j] != 0) {
  48. first = 1;
  49. if (digits[j] < 10) {
  50. offset = numberOffset;
  51. } else {
  52. offset = konstant;
  53. }
  54. printer_putchar((char)(digits[j] + offset));
  55. }
  56. }
  57. if (digits[0] < 10) {
  58. offset = numberOffset;
  59. } else {
  60. offset = konstant;
  61. }
  62. printer_putchar((char)(digits[0] + offset));
  63. }
  64.  
  65.  
  66. static void printPointer(void* p) {
  67. puts_on_line("0x");
  68. printHex((unsigned int)p, 87);
  69. }
  70.  
  71. static void print_int(int number) {
  72. if (number < 0) {
  73. printer_putchar('-');
  74. }
  75. const int maxLength = 10;
  76. int digits[maxLength];
  77. for (int i = 0; i < maxLength; ++i) {
  78. digits[i] = abs(number % 10);
  79. number /= 10;
  80. }
  81. int first = 0;
  82. for (int j = maxLength - 1; j > 0; --j) {
  83. if (first == 1 || digits[j] != 0) {
  84. first = 1;
  85. printer_putchar((char)(digits[j] + 48));
  86. }
  87. }
  88. printer_putchar((char)(digits[0] + 48));
  89. }
  90.  
  91. static void printList(list_t* list) {
  92. printPointer(list);
  93. printer_putchar('[');
  94. size_t size = list_get_size(list);
  95. if (size == 0) {
  96. puts_on_line("empty");
  97. } else {
  98. print_int(size);
  99. printer_putchar(':');
  100. printer_putchar(' ');
  101.  
  102. link_t* headItem = list->head.next;
  103. printPointer(headItem);
  104. link_t* item = headItem->next;
  105. while (item != &(list->head)) {
  106. printer_putchar('-');
  107. printPointer(item);
  108. item = item->next;
  109. }
  110. }
  111. printer_putchar(']');
  112. }
  113.  
  114. /** Prints given formatted string to console.
  115. *
  116. * @param format printf-style formatting string.
  117. */
  118. void printk(const char* format, ...) {
  119.  
  120. va_list args;
  121. va_start(args, format);
  122. const char* it = format;
  123. while (*it != '\0') {
  124. if (*it == '%') {
  125. it++;
  126. switch (*it) {
  127. case 'd':
  128. print_int(va_arg(args, int));
  129. break;
  130. case 's':
  131. puts_on_line(va_arg(args, char*));
  132. break;
  133. case 'x':
  134. printHex(va_arg(args, unsigned int), 87);
  135. break;
  136. case 'X':
  137. printHex(va_arg(args, unsigned int), 55);
  138. break;
  139. case 'c':
  140. printer_putchar(va_arg(args, int));
  141. break;
  142. case '%':
  143. printer_putchar('%');
  144. break;
  145. case 'p':
  146. it++;
  147. if (*it == 'L') {
  148. list_t* argument = va_arg(args, void*);
  149. printList(argument);
  150. } else {
  151. it--;
  152. void* argument = va_arg(args, void*);
  153. printPointer(argument);
  154. }
  155. break;
  156. default:
  157. printer_putchar('%');
  158. printer_putchar(*it);
  159. break;
  160. }
  161. } else {
  162. printer_putchar(*it);
  163. }
  164. it++;
  165. }
  166. va_end(args);
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement