title: How to implement newlin(\n) to my "kernel"?
body: <p>I am trying to create the newline(\n) character support for my &quot;kernel /terminal&quot;,
  I am learning from the following link <a href="https://wiki.osdev.org/Bare_Bones" rel="nofollow noreferrer">https://wiki.osdev.org/Bare_Bones</a></p>
  <p>The author has suggested the following
  Adding Support for Newlines to Terminal Driver
  &quot;in terminal_putchar check if c == '\n' and increment terminal_row and reset terminal_column.&quot;</p>
  <p>***Please don't share any code I unless you absolutely have to. I want to implement this myself, just let me know my mistakes.</p>
  <pre><code>#include &lt;stdbool.h&gt;
  #include &lt;stddef.h&gt;
  #include &lt;stdint.h&gt;
   
  /* Check if the compiler thinks you are targeting the wrong operating system. */
  #if defined(__linux__)
  #error &quot;You are not using a cross-compiler, you will most certainly run into trouble&quot;
  #endif
   
  /* This tutorial will only work for the 32-bit ix86 targets. */
  #if !defined(__i386__)
  #error &quot;This tutorial needs to be compiled with a ix86-elf compiler&quot;
  #endif
   
  /* Hardware text mode color constants. */
  enum vga_color {
      VGA_COLOR_BLACK = 0,
      VGA_COLOR_BLUE = 1,
      VGA_COLOR_GREEN = 2,
      VGA_COLOR_CYAN = 3,
      VGA_COLOR_RED = 4,
      VGA_COLOR_MAGENTA = 5,
      VGA_COLOR_BROWN = 6,
      VGA_COLOR_LIGHT_GREY = 7,
      VGA_COLOR_DARK_GREY = 8,
      VGA_COLOR_LIGHT_BLUE = 9,
      VGA_COLOR_LIGHT_GREEN = 10,
      VGA_COLOR_LIGHT_CYAN = 11,
      VGA_COLOR_LIGHT_RED = 12,
      VGA_COLOR_LIGHT_MAGENTA = 13,
      VGA_COLOR_LIGHT_BROWN = 14,
      VGA_COLOR_WHITE = 15,
  };
   
  static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) 
  {
      return fg | bg &lt;&lt; 4;
  }
   
  static inline uint16_t vga_entry(unsigned char uc, uint8_t color) 
  {
      return (uint16_t) uc | (uint16_t) color &lt;&lt; 8;
  }
   
  size_t strlen(const char* str) 
  {
      size_t len = 0;
      while (str[len])
          len++;
      return len;
  }
   
  static const size_t VGA_WIDTH = 80;
  static const size_t VGA_HEIGHT = 25;
   
  size_t terminal_row;
  size_t terminal_column;
  uint8_t terminal_color;
  uint16_t* terminal_buffer;
   
  void terminal_initialize(void) 
  {
      terminal_row = 0;
      terminal_column = 0;
      terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
      terminal_buffer = (uint16_t*) 0xB8000;
      for (size_t y = 0; y &lt; VGA_HEIGHT; y++) {
          for (size_t x = 0; x &lt; VGA_WIDTH; x++) {
              const size_t index = y * VGA_WIDTH + x;
              terminal_buffer[index] = vga_entry(' ', terminal_color);
          }
      }
  }
   
  void terminal_setcolor(uint8_t color) 
  {
      terminal_color = color;
  }
   
  void terminal_putentryat(char c, uint8_t color, size_t x, size_t y) 
  {
      const size_t index = y * VGA_WIDTH + x;
      terminal_buffer[index] = vga_entry(c, color);
  }
   
  void terminal_putchar(char c) 
  {
      terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
      if (++terminal_column == VGA_WIDTH) {
          terminal_column = 0;
          if (++terminal_row == VGA_HEIGHT)
              terminal_row = 0;
          if(c == '\n')
          {
              terminal_row = terminal_row + 1;
              terminal_column = 0;
          }
      }
  }
   
  void terminal_write(const char* data, size_t size) 
  {
      for (size_t i = 0; i &lt; size; i++)
          terminal_putchar(data[i]);
  }
   
  void terminal_writestring(const char* data) 
  {
      terminal_write(data, strlen(data));
  }
   
  void kernel_main(void) 
  {
      /* Initialize terminal interface */
      terminal_initialize();
   
      /* Newline support is left as an exercise. */
      terminal_writestring(&quot;Hello, kernel World!\n&quot;);
  }
  </code></pre>