SHARE
TWEET

Untitled

a guest Oct 22nd, 2019 65 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top