Format files
This commit is contained in:
parent
bc6f94e353
commit
3fe2d7aa33
10
.clang-format
Normal file
10
.clang-format
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
DerivePointerAlignment: 'true'
|
||||
SpaceBeforeParens: ControlStatements
|
||||
UseTab: ForIndentation
|
||||
IndentWidth: 2
|
||||
TabWidth: 2
|
||||
ColumnLimit: 120
|
||||
BreakBeforeBraces: Attach
|
||||
|
||||
...
|
365
arch/i386/tty.c
Executable file → Normal file
365
arch/i386/tty.c
Executable file → Normal file
|
@ -6,15 +6,15 @@
|
|||
#include "kernel/tty.h"
|
||||
#include "kernel/utils.h"
|
||||
|
||||
static const size_t TERM_WIDTH=80;
|
||||
static const size_t TERM_HEIGHT=25;
|
||||
static const size_t TERM_WIDTH = 80;
|
||||
static const size_t TERM_HEIGHT = 25;
|
||||
|
||||
static size_t terminal_row;
|
||||
static size_t terminal_column;
|
||||
|
||||
static uint8_t current_color;
|
||||
static uint16_t* term_buffer;
|
||||
static uint16_t* const vga_buffer = (uint16_t*) 0xB8000;
|
||||
static uint16_t* const vga_buffer = (uint16_t*)0xB8000;
|
||||
|
||||
void screen_initialize(void) {
|
||||
|
||||
|
@ -24,18 +24,16 @@ void screen_initialize(void) {
|
|||
term_buffer = vga_buffer;
|
||||
|
||||
for (size_t y = 0; y < TERM_HEIGHT; y++) {
|
||||
for(size_t x = 0; x < TERM_WIDTH; x++) {
|
||||
for (size_t x = 0; x < TERM_WIDTH; x++) {
|
||||
const size_t offset = y * TERM_WIDTH + x;
|
||||
term_buffer[offset] = vga_entry(' ', current_color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void term_setcolor(enum vga_colors color) {
|
||||
current_color = color;
|
||||
}
|
||||
void term_setcolor(enum vga_colors color) { current_color = color; }
|
||||
|
||||
void term_putentryat (char c, uint8_t color, size_t x, size_t y) {
|
||||
void term_putentryat(char c, uint8_t color, size_t x, size_t y) {
|
||||
const size_t offset = y * TERM_WIDTH + x;
|
||||
term_buffer[offset] = vga_entry(c, color);
|
||||
}
|
||||
|
@ -43,38 +41,35 @@ void term_putentryat (char c, uint8_t color, size_t x, size_t y) {
|
|||
void term_putchar(char c) {
|
||||
unsigned char uc = c;
|
||||
|
||||
//Handle escaped characters, such as newline, and crtn.
|
||||
// Handle escaped characters, such as newline, and crtn.
|
||||
switch (uc) {
|
||||
case '\n':
|
||||
case '\n':
|
||||
terminal_column = 0;
|
||||
terminal_row += 1;
|
||||
break;
|
||||
default:
|
||||
term_putentryat(uc, current_color, terminal_column, terminal_row);
|
||||
if (++terminal_column == TERM_WIDTH) {
|
||||
terminal_column = 0;
|
||||
terminal_row += 1;
|
||||
break;
|
||||
default:
|
||||
term_putentryat(uc, current_color, terminal_column, terminal_row);
|
||||
if (++terminal_column == TERM_WIDTH) {
|
||||
terminal_column = 0;
|
||||
if (++terminal_row == TERM_HEIGHT) {
|
||||
term_scroll(false);
|
||||
terminal_row = 0;
|
||||
}
|
||||
if (++terminal_row == TERM_HEIGHT) {
|
||||
term_scroll(false);
|
||||
terminal_row = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
struct csi_sequence parse_csi(const char* data, size_t size) {
|
||||
enum State { PARAMETER, INTERMEDIATE, FINAL, INVALID };
|
||||
enum State state = PARAMETER;
|
||||
|
||||
struct csi_sequence sequence = {
|
||||
.parameter = NULL,
|
||||
.parameter_len = 0,
|
||||
.intermediate = NULL,
|
||||
.intermediate_len = 0,
|
||||
.final = NULL,
|
||||
.valid = false
|
||||
};
|
||||
struct csi_sequence sequence = {.parameter = NULL,
|
||||
.parameter_len = 0,
|
||||
.intermediate = NULL,
|
||||
.intermediate_len = 0,
|
||||
.final = NULL,
|
||||
.valid = false};
|
||||
|
||||
for (size_t j = 0; j < size; j++) {
|
||||
uint8_t c = data[j];
|
||||
|
@ -103,57 +98,56 @@ struct csi_sequence parse_csi(const char* data, size_t size) {
|
|||
}
|
||||
|
||||
void term_write(const char* data, size_t size) {
|
||||
for(size_t i = 0; i < size; i++) {
|
||||
//Begin handling ANSI escape codes.
|
||||
if(data[i] == 0x1b) { //The current character is ESC - the start of ANSI codes.
|
||||
//term_writes("ANSI Code encountered: ");
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
// Begin handling ANSI escape codes.
|
||||
if (data[i] == 0x1b) { // The current character is ESC - the start of ANSI codes.
|
||||
// term_writes("ANSI Code encountered: ");
|
||||
|
||||
bool string_terminated = false; //Flag used in some of the escape codes
|
||||
bool string_terminated = false; // Flag used in some of the escape codes
|
||||
|
||||
// TODO: Should only progress if we have at least 2 more bytes
|
||||
|
||||
switch ((uint8_t)data[i + 1]) {
|
||||
case '[': //CSI - Control Sequence Introducer (The most common one, hence it comes first)
|
||||
{
|
||||
struct csi_sequence sequence = parse_csi(data + i + 2, size - (i + 2));
|
||||
if (sequence.valid) {
|
||||
// Send it off to our handler function to keep this part clean
|
||||
handleControlSequence(sequence);
|
||||
i += sequence.parameter_len + sequence.intermediate_len + 2; // Move past sequence
|
||||
}
|
||||
}
|
||||
break;
|
||||
//Single shifts are not handled, so just print them and exit
|
||||
case 'N': //SS2 - Single Shift Two
|
||||
term_writes("Single Shift Two\n");
|
||||
break;
|
||||
case 'O': //SS3 - Single Shift Three
|
||||
term_writes("Single Shift Three\n");
|
||||
break;
|
||||
case '[': // CSI - Control Sequence Introducer (The most common one, hence it comes first)
|
||||
{
|
||||
struct csi_sequence sequence = parse_csi(data + i + 2, size - (i + 2));
|
||||
if (sequence.valid) {
|
||||
// Send it off to our handler function to keep this part clean
|
||||
handleControlSequence(sequence);
|
||||
i += sequence.parameter_len + sequence.intermediate_len + 2; // Move past sequence
|
||||
}
|
||||
} break;
|
||||
// Single shifts are not handled, so just print them and exit
|
||||
case 'N': // SS2 - Single Shift Two
|
||||
term_writes("Single Shift Two\n");
|
||||
break;
|
||||
case 'O': // SS3 - Single Shift Three
|
||||
term_writes("Single Shift Three\n");
|
||||
break;
|
||||
|
||||
//Control Strings
|
||||
case 'P': //DCS - Device Control String
|
||||
term_writes("Device Control String");
|
||||
string_terminated = false;
|
||||
break;
|
||||
case '\\': //ST - String Terminator
|
||||
term_writes("String Terminator\n");
|
||||
string_terminated = true;
|
||||
break;
|
||||
case ']': //OSC - Operating System Command
|
||||
term_writes("Operating System Command\n");
|
||||
string_terminated = false;
|
||||
break;
|
||||
case 'X': //SOS - Start Of String
|
||||
term_writes("Start of String");
|
||||
string_terminated = false;
|
||||
break;
|
||||
case '^': //PM - Privacy Message
|
||||
term_writes("Privacy Message\n");
|
||||
break;
|
||||
case '_': //APC - Application Program Command
|
||||
term_writes("Application Program Command\n");
|
||||
break;
|
||||
// Control Strings
|
||||
case 'P': // DCS - Device Control String
|
||||
term_writes("Device Control String");
|
||||
string_terminated = false;
|
||||
break;
|
||||
case '\\': // ST - String Terminator
|
||||
term_writes("String Terminator\n");
|
||||
string_terminated = true;
|
||||
break;
|
||||
case ']': // OSC - Operating System Command
|
||||
term_writes("Operating System Command\n");
|
||||
string_terminated = false;
|
||||
break;
|
||||
case 'X': // SOS - Start Of String
|
||||
term_writes("Start of String");
|
||||
string_terminated = false;
|
||||
break;
|
||||
case '^': // PM - Privacy Message
|
||||
term_writes("Privacy Message\n");
|
||||
break;
|
||||
case '_': // APC - Application Program Command
|
||||
term_writes("Application Program Command\n");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
term_putchar(data[i]);
|
||||
|
@ -161,9 +155,7 @@ void term_write(const char* data, size_t size) {
|
|||
}
|
||||
}
|
||||
|
||||
void term_writes(const char* data) {
|
||||
term_write(data, strlen(data));
|
||||
}
|
||||
void term_writes(const char* data) { term_write(data, strlen(data)); }
|
||||
|
||||
void puts(const char* string) {
|
||||
term_write(string, strlen(string));
|
||||
|
@ -171,10 +163,10 @@ void puts(const char* string) {
|
|||
}
|
||||
|
||||
void handleControlSequence(struct csi_sequence sequence) {
|
||||
//Check for our failsafes
|
||||
// Check for our failsafes
|
||||
|
||||
if (sequence.valid) {
|
||||
int n = 0; //Default of the flag used for a few items
|
||||
int n = 0; // Default of the flag used for a few items
|
||||
|
||||
// Parse parameters, we only care about a max 2 of number only parameters
|
||||
// for now
|
||||
|
@ -184,7 +176,7 @@ void handleControlSequence(struct csi_sequence sequence) {
|
|||
for (size_t i = 0; i < sequence.parameter_len && param_count < 1; i++) {
|
||||
char c = sequence.parameter[i];
|
||||
if (isDigit(c)) {
|
||||
n = (n*10) + (sequence.parameter[i] - '0');
|
||||
n = (n * 10) + (sequence.parameter[i] - '0');
|
||||
} else if (c == ';') {
|
||||
params[param_count++] = n;
|
||||
}
|
||||
|
@ -193,96 +185,103 @@ void handleControlSequence(struct csi_sequence sequence) {
|
|||
}
|
||||
|
||||
switch (*(sequence.final)) {
|
||||
case 'H': case 'f': // CUP - Cursor Position
|
||||
// TODO: Check to see if we have 2 paramaters
|
||||
if (params[0]) params[0]--;
|
||||
if (params[1]) params[1]--;
|
||||
set_cursor(params[0], params[1]);
|
||||
break;
|
||||
case 'A': //CUU - Cursor Up
|
||||
if (!params[0]) params[0] = 1;
|
||||
set_cursor(terminal_column, terminal_row - params[0]);
|
||||
break;
|
||||
case 'B': //CUD - Cursor Down
|
||||
if (!params[0]) params[0] = 1;
|
||||
set_cursor(terminal_column, terminal_row + params[0]);
|
||||
break;
|
||||
case 'C': //CUF - Cursor Forward
|
||||
if (!params[0]) params[0] = 1;
|
||||
set_cursor(terminal_column + params[0], terminal_row);
|
||||
break;
|
||||
case 'D': //CUB - Cursor Back
|
||||
if (!params[0]) params[0] = 1;
|
||||
set_cursor(terminal_column - params[0], terminal_row);
|
||||
break;
|
||||
case 'E': //CNL - Cursor Next Line
|
||||
if (!params[0]) params[0] = 1;
|
||||
set_cursor(0, terminal_row + params[0]);
|
||||
break;
|
||||
case 'F': //CPL - Cursor Previous Line
|
||||
if (!params[0]) params[0] = 1;
|
||||
set_cursor(0, terminal_row - params[0]);
|
||||
break;
|
||||
case 'G': //CHA - Cursor Horizontal Absolute
|
||||
if (params[0]) params[0]--;
|
||||
set_cursor(params[0], terminal_row);
|
||||
break;
|
||||
case 'J': //ED - Erase in Display
|
||||
//current cursor pos = y * width + x
|
||||
{
|
||||
int pos = terminal_row * 80 + terminal_column;
|
||||
if (params[0] == 0) { // Clear from cursor to end of screen
|
||||
for(; pos < (25 * 80); pos++) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
} else if(params[0] == 1) { // Clear from cursor to beginning
|
||||
for(; pos > 0; pos--) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
} else if(params[0] == 2 || params[0] == 3) { // Clear entire screen
|
||||
// TODO: Support scrollback buffer? (n = 3)
|
||||
for(int i = 0; i < (25*80); i++) {
|
||||
vga_buffer[0] = '\0';
|
||||
}
|
||||
}
|
||||
case 'H':
|
||||
case 'f': // CUP - Cursor Position
|
||||
// TODO: Check to see if we have 2 paramaters
|
||||
if (params[0])
|
||||
params[0]--;
|
||||
if (params[1])
|
||||
params[1]--;
|
||||
set_cursor(params[0], params[1]);
|
||||
break;
|
||||
case 'A': // CUU - Cursor Up
|
||||
if (!params[0])
|
||||
params[0] = 1;
|
||||
set_cursor(terminal_column, terminal_row - params[0]);
|
||||
break;
|
||||
case 'B': // CUD - Cursor Down
|
||||
if (!params[0])
|
||||
params[0] = 1;
|
||||
set_cursor(terminal_column, terminal_row + params[0]);
|
||||
break;
|
||||
case 'C': // CUF - Cursor Forward
|
||||
if (!params[0])
|
||||
params[0] = 1;
|
||||
set_cursor(terminal_column + params[0], terminal_row);
|
||||
break;
|
||||
case 'D': // CUB - Cursor Back
|
||||
if (!params[0])
|
||||
params[0] = 1;
|
||||
set_cursor(terminal_column - params[0], terminal_row);
|
||||
break;
|
||||
case 'E': // CNL - Cursor Next Line
|
||||
if (!params[0])
|
||||
params[0] = 1;
|
||||
set_cursor(0, terminal_row + params[0]);
|
||||
break;
|
||||
case 'F': // CPL - Cursor Previous Line
|
||||
if (!params[0])
|
||||
params[0] = 1;
|
||||
set_cursor(0, terminal_row - params[0]);
|
||||
break;
|
||||
case 'G': // CHA - Cursor Horizontal Absolute
|
||||
if (params[0])
|
||||
params[0]--;
|
||||
set_cursor(params[0], terminal_row);
|
||||
break;
|
||||
case 'J': // ED - Erase in Display
|
||||
{
|
||||
// current cursor pos = y * width + x
|
||||
int pos = terminal_row * 80 + terminal_column;
|
||||
if (params[0] == 0) { // Clear from cursor to end of screen
|
||||
for (; pos < (25 * 80); pos++) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
break;
|
||||
case 'K': //EL - Erase in Line
|
||||
{
|
||||
int pos = terminal_row * 80 + terminal_column;
|
||||
if(params[0] == 0) { // From cursor to end of line
|
||||
int endPos = (terminal_row + 1) * 80 - 1; // End of line = current row + 25 columns = current row + 1
|
||||
for(; pos < endPos; pos++) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
} else if (params[0] == 1) { // From cursor to start of line
|
||||
int endPos = terminal_row * 80; // Start of line = end of previous line + 1 == current line
|
||||
for(; pos > endPos; pos--) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
} else if(params[0] == 2) { // Entire current line
|
||||
pos = terminal_row * 80;
|
||||
int endPos = (terminal_row + 1) * 80 - 1;
|
||||
for(; pos < endPos; pos++) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
}
|
||||
} else if (params[0] == 1) { // Clear from cursor to beginning
|
||||
for (; pos > 0; pos--) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
break;
|
||||
case 'S': //SU - Scroll Up
|
||||
term_scroll(true);
|
||||
break;
|
||||
case 'T': //SD - Scroll Down
|
||||
term_scroll(false);
|
||||
break;
|
||||
} else if (params[0] == 2 || params[0] == 3) { // Clear entire screen
|
||||
// TODO: Support scrollback buffer? (n = 3)
|
||||
for (int i = 0; i < (25 * 80); i++) {
|
||||
vga_buffer[0] = '\0';
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'K': // EL - Erase in Line
|
||||
{
|
||||
int pos = terminal_row * 80 + terminal_column;
|
||||
if (params[0] == 0) { // From cursor to end of line
|
||||
int endPos = (terminal_row + 1) * 80 - 1; // End of line = current row + 25 columns = current row + 1
|
||||
for (; pos < endPos; pos++) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
} else if (params[0] == 1) { // From cursor to start of line
|
||||
int endPos = terminal_row * 80; // Start of line = end of previous line + 1 == current line
|
||||
for (; pos > endPos; pos--) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
} else if (params[0] == 2) { // Entire current line
|
||||
pos = terminal_row * 80;
|
||||
int endPos = (terminal_row + 1) * 80 - 1;
|
||||
for (; pos < endPos; pos++) {
|
||||
vga_buffer[pos] = '\0';
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'S': // SU - Scroll Up
|
||||
term_scroll(true);
|
||||
break;
|
||||
case 'T': // SD - Scroll Down
|
||||
term_scroll(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool isDigit(char c) {
|
||||
return c >= '0' && c <= '9';
|
||||
}
|
||||
bool isDigit(char c) { return c >= '0' && c <= '9'; }
|
||||
|
||||
void set_cursor(int n, int m) {
|
||||
terminal_column = n;
|
||||
|
@ -292,41 +291,43 @@ void set_cursor(int n, int m) {
|
|||
void term_scroll(bool down) {
|
||||
|
||||
int current_pos;
|
||||
if(down) {
|
||||
current_pos = 25 * 80; //Start of the last line.
|
||||
if (down) {
|
||||
current_pos = 25 * 80; // Start of the last line.
|
||||
} else {
|
||||
current_pos = 160; //Start of the second line.
|
||||
current_pos = 160; // Start of the second line.
|
||||
}
|
||||
|
||||
unsigned char* term_buffer = (unsigned char*) vga_buffer;
|
||||
unsigned char* term_buffer = (unsigned char*)vga_buffer;
|
||||
|
||||
if(down) { //To scroll down, move every character into the one below it, or "pull" every character down
|
||||
while(current_pos > 80) {
|
||||
if (down) { // To scroll down, move every character into the one below it, or "pull" every character down
|
||||
while (current_pos > 80) {
|
||||
term_buffer[current_pos + 160] = vga_buffer[current_pos];
|
||||
term_buffer[current_pos + 159] = vga_buffer[current_pos - 1];
|
||||
current_pos -= 2;
|
||||
}
|
||||
} else {
|
||||
while (current_pos <= 4000) {
|
||||
term_buffer[current_pos - 160 /*The character immediately below it*/] = vga_buffer[current_pos]; //Move each character up a line
|
||||
term_buffer[current_pos - 159 /*The color of the character below*/] = vga_buffer[current_pos + 1]; //As well as its color
|
||||
current_pos += 2; //Move to next char
|
||||
term_buffer[current_pos - 160 /*The character immediately below it*/] =
|
||||
vga_buffer[current_pos]; // Move each character up a line
|
||||
term_buffer[current_pos - 159 /*The color of the character below*/] =
|
||||
vga_buffer[current_pos + 1]; // As well as its color
|
||||
current_pos += 2; // Move to next char
|
||||
}
|
||||
}
|
||||
|
||||
if(down) {
|
||||
current_pos = 0; //Start of first line
|
||||
for(; current_pos < 80; current_pos++) {
|
||||
|
||||
if (down) {
|
||||
current_pos = 0; // Start of first line
|
||||
for (; current_pos < 80; current_pos++) {
|
||||
term_buffer[current_pos] = '\0';
|
||||
current_pos += 2;
|
||||
}
|
||||
} else {
|
||||
; //Start of the last line
|
||||
//Wipe out the bottom line
|
||||
for(current_pos = 3840; current_pos <= 3920; current_pos += 2) {
|
||||
; // Start of the last line
|
||||
// Wipe out the bottom line
|
||||
for (current_pos = 3840; current_pos <= 3920; current_pos += 2) {
|
||||
term_buffer[current_pos] = 0;
|
||||
}
|
||||
}
|
||||
terminal_row = 24; //Start writing on the last line
|
||||
terminal_row = 24; // Start writing on the last line
|
||||
terminal_column = 0;
|
||||
}
|
||||
|
|
61
include/arch/i386/vga.h
Executable file → Normal file
61
include/arch/i386/vga.h
Executable file → Normal file
|
@ -1,34 +1,29 @@
|
|||
#ifndef ARCH_I386_VGA_H
|
||||
#define ARCH_I386_VGA_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
enum vga_colors {
|
||||
BLACK = 0,
|
||||
BLUE = 1,
|
||||
GREEN = 2,
|
||||
CYAN = 3,
|
||||
RED = 4,
|
||||
MAGENTA = 5,
|
||||
BROWN = 6,
|
||||
LIGHT_GREY = 7,
|
||||
DARK_GREY = 8,
|
||||
LIGHT_BLUE = 9,
|
||||
LIGHT_GREEN = 10,
|
||||
LIGHT_CYAN = 11,
|
||||
LIGHT_RED = 12,
|
||||
LIGHT_MAGENTA = 13,
|
||||
LIGHT_BROWN = 14,
|
||||
WHITE = 15
|
||||
};
|
||||
|
||||
static inline uint8_t vga_color_set(enum vga_colors fg, enum vga_colors bg) {
|
||||
return fg | bg << 4;
|
||||
}
|
||||
|
||||
static inline uint16_t vga_entry(unsigned char uc, uint8_t color) {
|
||||
return (uint16_t) uc | (uint16_t) color << 8;
|
||||
}
|
||||
|
||||
#ifndef ARCH_I386_VGA_H
|
||||
#define ARCH_I386_VGA_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
enum vga_colors {
|
||||
BLACK = 0,
|
||||
BLUE = 1,
|
||||
GREEN = 2,
|
||||
CYAN = 3,
|
||||
RED = 4,
|
||||
MAGENTA = 5,
|
||||
BROWN = 6,
|
||||
LIGHT_GREY = 7,
|
||||
DARK_GREY = 8,
|
||||
LIGHT_BLUE = 9,
|
||||
LIGHT_GREEN = 10,
|
||||
LIGHT_CYAN = 11,
|
||||
LIGHT_RED = 12,
|
||||
LIGHT_MAGENTA = 13,
|
||||
LIGHT_BROWN = 14,
|
||||
WHITE = 15
|
||||
};
|
||||
|
||||
static inline uint8_t vga_color_set(enum vga_colors fg, enum vga_colors bg) { return fg | bg << 4; }
|
||||
|
||||
static inline uint16_t vga_entry(unsigned char uc, uint8_t color) { return (uint16_t)uc | (uint16_t)color << 8; }
|
||||
|
||||
#endif
|
1
include/kernel/tty.h
Executable file → Normal file
1
include/kernel/tty.h
Executable file → Normal file
|
@ -15,7 +15,6 @@ struct csi_sequence {
|
|||
bool valid;
|
||||
};
|
||||
|
||||
|
||||
void term_setcolor(enum vga_colors);
|
||||
void screen_initialize(void);
|
||||
void term_putentryat(char, uint8_t, size_t, size_t);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#include <stddef.h>
|
||||
|
||||
/* A temporary file, to get the system compiling. */
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
/* A temporary file, to get the system compiling. */
|
||||
|
||||
size_t strlen(const char*);
|
57
include/vga.h
Executable file → Normal file
57
include/vga.h
Executable file → Normal file
|
@ -1,31 +1,26 @@
|
|||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
enum vga_colors {
|
||||
BLACK = 0,
|
||||
BLUE = 1,
|
||||
GREEN = 2,
|
||||
CYAN = 3,
|
||||
RED = 4,
|
||||
MAGENTA = 5,
|
||||
BROWN = 6,
|
||||
LIGHT_GREY = 7,
|
||||
DARK_GREY = 8,
|
||||
LIGHT_BLUE = 9,
|
||||
LIGHT_GREEN = 10,
|
||||
LIGHT_CYAN = 11,
|
||||
LIGHT_RED = 12,
|
||||
LIGHT_MAGENTA = 13,
|
||||
LIGHT_BROWN = 14,
|
||||
WHITE = 15
|
||||
};
|
||||
|
||||
static inline uint8_t vga_color_set(enum vga_colors fg, enum vga_colors bg) {
|
||||
return fg | bg << 4;
|
||||
}
|
||||
|
||||
static inline uint16_t vga_entry(unsigned char uc, uint8_t color) {
|
||||
return (uint16_t) uc | (uint16_t) color << 8;
|
||||
}
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
enum vga_colors {
|
||||
BLACK = 0,
|
||||
BLUE = 1,
|
||||
GREEN = 2,
|
||||
CYAN = 3,
|
||||
RED = 4,
|
||||
MAGENTA = 5,
|
||||
BROWN = 6,
|
||||
LIGHT_GREY = 7,
|
||||
DARK_GREY = 8,
|
||||
LIGHT_BLUE = 9,
|
||||
LIGHT_GREEN = 10,
|
||||
LIGHT_CYAN = 11,
|
||||
LIGHT_RED = 12,
|
||||
LIGHT_MAGENTA = 13,
|
||||
LIGHT_BROWN = 14,
|
||||
WHITE = 15
|
||||
};
|
||||
|
||||
static inline uint8_t vga_color_set(enum vga_colors fg, enum vga_colors bg) { return fg | bg << 4; }
|
||||
|
||||
static inline uint16_t vga_entry(unsigned char uc, uint8_t color) { return (uint16_t)uc | (uint16_t)color << 8; }
|
||||
|
|
41
kernel/kernel.c
Executable file → Normal file
41
kernel/kernel.c
Executable file → Normal file
|
@ -1,20 +1,21 @@
|
|||
//#include <stdio.h>
|
||||
|
||||
#include "kernel/tty.h"
|
||||
|
||||
int kernel_main(void) {
|
||||
//Prepare the screen, and blank it out.
|
||||
screen_initialize();
|
||||
|
||||
//Print a copyright message.
|
||||
term_writes("(c)");
|
||||
term_setcolor(GREEN);
|
||||
term_writes(" Project");
|
||||
term_setcolor(RED);
|
||||
term_writes("RED");
|
||||
term_setcolor(WHITE);
|
||||
term_writes(", 2019\n");
|
||||
|
||||
for(;;) {}
|
||||
return 0;
|
||||
}
|
||||
//#include <stdio.h>
|
||||
|
||||
#include "kernel/tty.h"
|
||||
|
||||
int kernel_main(void) {
|
||||
// Prepare the screen, and blank it out.
|
||||
screen_initialize();
|
||||
|
||||
// Print a copyright message.
|
||||
term_writes("(c)");
|
||||
term_setcolor(GREEN);
|
||||
term_writes(" Project");
|
||||
term_setcolor(RED);
|
||||
term_writes("RED");
|
||||
term_setcolor(WHITE);
|
||||
term_writes(", 2019\n");
|
||||
|
||||
for (;;) {
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
94
kernel/syscalls.c
Executable file → Normal file
94
kernel/syscalls.c
Executable file → Normal file
|
@ -1,48 +1,48 @@
|
|||
/*#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/times.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
|
||||
//prototypes; these are the bare minimum for newlib to compile.
|
||||
|
||||
void _exit();
|
||||
|
||||
int close(int file);
|
||||
|
||||
char **environ;
|
||||
|
||||
int execve(char *name, char **argv, char **env);
|
||||
|
||||
int fork();
|
||||
|
||||
int fstat(int file, struct stat *st);
|
||||
|
||||
int getpid();
|
||||
|
||||
int isatty(int file);
|
||||
|
||||
int kill(int pid, int sig);
|
||||
|
||||
int link(char *old, char *new);
|
||||
|
||||
int lseek(int file, int ptr, int dir);
|
||||
|
||||
int open(const char* name, int flags, ...);
|
||||
|
||||
int read(int file, char* ptr, int len);
|
||||
|
||||
caddr_t sbrk(int incr);
|
||||
|
||||
int stat(const char* file, struct stat *st);
|
||||
|
||||
clock_t times(struct tms* buf);
|
||||
|
||||
int unlink(char* name);
|
||||
|
||||
int wait(int file, char* ptr, int len);
|
||||
|
||||
int gettimeofday(struct timeval* p, struct timezone* z);
|
||||
/*#include <sys/stat.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/times.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
//prototypes; these are the bare minimum for newlib to compile.
|
||||
|
||||
void _exit();
|
||||
|
||||
int close(int file);
|
||||
|
||||
char **environ;
|
||||
|
||||
int execve(char *name, char **argv, char **env);
|
||||
|
||||
int fork();
|
||||
|
||||
int fstat(int file, struct stat *st);
|
||||
|
||||
int getpid();
|
||||
|
||||
int isatty(int file);
|
||||
|
||||
int kill(int pid, int sig);
|
||||
|
||||
int link(char *old, char *new);
|
||||
|
||||
int lseek(int file, int ptr, int dir);
|
||||
|
||||
int open(const char* name, int flags, ...);
|
||||
|
||||
int read(int file, char* ptr, int len);
|
||||
|
||||
caddr_t sbrk(int incr);
|
||||
|
||||
int stat(const char* file, struct stat *st);
|
||||
|
||||
clock_t times(struct tms* buf);
|
||||
|
||||
int unlink(char* name);
|
||||
|
||||
int wait(int file, char* ptr, int len);
|
||||
|
||||
int gettimeofday(struct timeval* p, struct timezone* z);
|
||||
*/
|
14
kernel/utils.c
Executable file → Normal file
14
kernel/utils.c
Executable file → Normal file
|
@ -1,8 +1,8 @@
|
|||
#include <stddef.h>
|
||||
|
||||
size_t strlen(const char* string) {
|
||||
size_t size = 0;
|
||||
while (string[size])
|
||||
size++;
|
||||
return size;
|
||||
#include <stddef.h>
|
||||
|
||||
size_t strlen(const char* string) {
|
||||
size_t size = 0;
|
||||
while (string[size])
|
||||
size++;
|
||||
return size;
|
||||
}
|
|
@ -1,19 +1,19 @@
|
|||
#ifndef _STDIO_H
|
||||
#define _STDIO_H 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#define EOF (-1)
|
||||
|
||||
struct __sFile {
|
||||
int unused;
|
||||
};
|
||||
|
||||
typedef struct __sFile FILE;
|
||||
|
||||
#define stderr (_impure_ptr->_stderr)
|
||||
|
||||
int printf(const char* __restrict, ...);
|
||||
int putchar(int);
|
||||
int puts(const char*);
|
||||
#ifndef _STDIO_H
|
||||
#define _STDIO_H 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#define EOF (-1)
|
||||
|
||||
struct __sFile {
|
||||
int unused;
|
||||
};
|
||||
|
||||
typedef struct __sFile FILE;
|
||||
|
||||
#define stderr (_impure_ptr->_stderr)
|
||||
|
||||
int printf(const char* __restrict, ...);
|
||||
int putchar(int);
|
||||
int puts(const char*);
|
||||
#endif
|
1195
libc/include/stdlib.h
Executable file → Normal file
1195
libc/include/stdlib.h
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
24
libc/include/string.h
Executable file → Normal file
24
libc/include/string.h
Executable file → Normal file
|
@ -1,13 +1,13 @@
|
|||
#ifndef _STRING_H
|
||||
#define _STRING_H 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <stddef.h>
|
||||
|
||||
int memcmp(const void*, const void*, size_t);
|
||||
void* memcpy(void* __restrict, const void* __restrict, size_t);
|
||||
void* memmove(void*, const void*, size_t);
|
||||
void* memset(void*, int, size_t);
|
||||
size_t strlen(const char*);
|
||||
|
||||
#ifndef _STRING_H
|
||||
#define _STRING_H 1
|
||||
|
||||
#include <stddef.h>
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
int memcmp(const void*, const void*, size_t);
|
||||
void* memcpy(void* __restrict, const void* __restrict, size_t);
|
||||
void* memmove(void*, const void*, size_t);
|
||||
void* memset(void*, int, size_t);
|
||||
size_t strlen(const char*);
|
||||
|
||||
#endif
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef _SYS_CDEFS_H
|
||||
#define _SYS_CDEFS_H 1
|
||||
|
||||
#define __red_libc 1
|
||||
#ifndef _SYS_CDEFS_H
|
||||
#define _SYS_CDEFS_H 1
|
||||
|
||||
#define __red_libc 1
|
||||
#endif
|
187
libc/stdio/printf.c
Executable file → Normal file
187
libc/stdio/printf.c
Executable file → Normal file
|
@ -1,94 +1,93 @@
|
|||
#include <limits.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
static bool print(const char* data, size_t length) {
|
||||
const unsigned char* bytes = (const unsigned char*) data;
|
||||
for (size_t i = 0; i < length; i++)
|
||||
if(putchar(bytes[i]) == EOF)
|
||||
return false'
|
||||
return true;
|
||||
}
|
||||
|
||||
int printf(const char* restrict format, ...) {
|
||||
va_list parameters;
|
||||
va_start(parameters, format);
|
||||
|
||||
int written = 0;
|
||||
|
||||
while(*format != '\0') {
|
||||
size_t maxrem = INT_MAX - writen;
|
||||
|
||||
if(format[0] != '%' || format[1] == '%') {
|
||||
if(format[0] == '%')
|
||||
format++;
|
||||
size_t amount = 1;
|
||||
|
||||
while (format[amount] && format[amount] != '%')
|
||||
amount++;
|
||||
|
||||
if(maxrem < amount) {
|
||||
//TODO: Set an OVERFLOW error
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((!print(format, amount))
|
||||
return -1;
|
||||
|
||||
format += amount;
|
||||
written += amount;
|
||||
continue;
|
||||
}
|
||||
|
||||
const char* first_format = format++;
|
||||
|
||||
switch(*format) {
|
||||
case 'c':
|
||||
format++;
|
||||
char c = (char) va_arg(parameters, int);
|
||||
if(!maxrem) {
|
||||
//TODO: Set OVERFLOW
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!print(&c, sizeof(c)))
|
||||
return -1;
|
||||
written++;
|
||||
break;
|
||||
case 's':
|
||||
format++;
|
||||
|
||||
const char* str = va_arg(parameters, const char*);
|
||||
size_t len = strlen(str);
|
||||
|
||||
if(maxrem < len) {
|
||||
//TODO: Set OVERFLOW
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!print(str, len))
|
||||
return -1;
|
||||
|
||||
written += len;
|
||||
break;
|
||||
default:
|
||||
format = first_format;
|
||||
size_t len = strlen(format);
|
||||
if(maxrem < len) {
|
||||
//TODO: Set OVERFLOW
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!print(format, len))
|
||||
return -1;
|
||||
written += len;
|
||||
format += len;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
va_end(parameters);
|
||||
return written;
|
||||
}
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
static bool print(const char* data, size_t length) {
|
||||
const unsigned char* bytes = (const unsigned char*)data;
|
||||
for (size_t i = 0; i < length; i++)
|
||||
if (putchar(bytes[i]) == EOF)
|
||||
return false' return true;
|
||||
}
|
||||
|
||||
int printf(const char* restrict format, ...) {
|
||||
va_list parameters;
|
||||
va_start(parameters, format);
|
||||
|
||||
int written = 0;
|
||||
|
||||
while (*format != '\0') {
|
||||
size_t maxrem = INT_MAX - writen;
|
||||
|
||||
if (format[0] != '%' || format[1] == '%') {
|
||||
if (format[0] == '%')
|
||||
format++;
|
||||
size_t amount = 1;
|
||||
|
||||
while (format[amount] && format[amount] != '%')
|
||||
amount++;
|
||||
|
||||
if (maxrem < amount) {
|
||||
// TODO: Set an OVERFLOW error
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((!print(format, amount))
|
||||
return -1;
|
||||
|
||||
format += amount;
|
||||
written += amount;
|
||||
continue;
|
||||
}
|
||||
|
||||
const char* first_format = format++;
|
||||
|
||||
switch (*format) {
|
||||
case 'c':
|
||||
format++;
|
||||
char c = (char)va_arg(parameters, int);
|
||||
if (!maxrem) {
|
||||
// TODO: Set OVERFLOW
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!print(&c, sizeof(c)))
|
||||
return -1;
|
||||
written++;
|
||||
break;
|
||||
case 's':
|
||||
format++;
|
||||
|
||||
const char* str = va_arg(parameters, const char*);
|
||||
size_t len = strlen(str);
|
||||
|
||||
if (maxrem < len) {
|
||||
// TODO: Set OVERFLOW
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!print(str, len))
|
||||
return -1;
|
||||
|
||||
written += len;
|
||||
break;
|
||||
default:
|
||||
format = first_format;
|
||||
size_t len = strlen(format);
|
||||
if (maxrem < len) {
|
||||
// TODO: Set OVERFLOW
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!print(format, len))
|
||||
return -1;
|
||||
written += len;
|
||||
format += len;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
va_end(parameters);
|
||||
return written;
|
||||
}
|
||||
|
|
28
libc/stdio/putchar.c
Executable file → Normal file
28
libc/stdio/putchar.c
Executable file → Normal file
|
@ -1,15 +1,15 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#if defined(__is_libk)
|
||||
#include <kernel/tty.h>
|
||||
#endif
|
||||
|
||||
int putchar(int ic) {
|
||||
#if defined(__is_libk)
|
||||
char c = (char) ic;
|
||||
term_write(&c, sizeof(c));
|
||||
#else
|
||||
//TODO: Implement stdio & the write call
|
||||
#endif
|
||||
return ic;
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined(__is_libk)
|
||||
#include <kernel/tty.h>
|
||||
#endif
|
||||
|
||||
int putchar(int ic) {
|
||||
#if defined(__is_libk)
|
||||
char c = (char)ic;
|
||||
term_write(&c, sizeof(c));
|
||||
#else
|
||||
// TODO: Implement stdio & the write call
|
||||
#endif
|
||||
return ic;
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int puts(const char* string) {
|
||||
return printf("%s\n"), string);
|
||||
#include <stdio.h>
|
||||
|
||||
int puts(const char* string) {
|
||||
return printf("%s\n"), string);
|
||||
}
|
28
libc/stdlib/abort.c
Executable file → Normal file
28
libc/stdlib/abort.c
Executable file → Normal file
|
@ -1,15 +1,15 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
__attribute__((__noreturn__))
|
||||
void abort(void) {
|
||||
|
||||
#if defined(__is_libk)
|
||||
//TODO: Kernel panic.
|
||||
printf(">>PANIC<<<\n abort() panicked!\n");
|
||||
#else
|
||||
printf("abort() called\n");
|
||||
#endif
|
||||
while(1) {}
|
||||
__builtin_unreachable();
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
__attribute__((__noreturn__)) void abort(void) {
|
||||
|
||||
#if defined(__is_libk)
|
||||
// TODO: Kernel panic.
|
||||
printf(">>PANIC<<<\n abort() panicked!\n");
|
||||
#else
|
||||
printf("abort() called\n");
|
||||
#endif
|
||||
while (1) {
|
||||
}
|
||||
__builtin_unreachable();
|
||||
}
|
24
libc/string/memcmp.c
Executable file → Normal file
24
libc/string/memcmp.c
Executable file → Normal file
|
@ -1,13 +1,13 @@
|
|||
#include <string.h>
|
||||
|
||||
int memcmp(const void* aptr, const void* bptr, size_t size_ {
|
||||
const unsigned char* a = (const unsigned char*) aptr;
|
||||
const unsigned char* b = (const unsigned char*) bptr;
|
||||
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
if(a[i] < b[i]
|
||||
return -1
|
||||
else if(b[i] < a[i])
|
||||
return 1;
|
||||
}
|
||||
#include <string.h>
|
||||
|
||||
int memcmp(const void* aptr, const void* bptr, size_t size_ {
|
||||
const unsigned char* a = (const unsigned char*)aptr;
|
||||
const unsigned char* b = (const unsigned char*)bptr;
|
||||
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
if(a[i] < b[i]
|
||||
return -1
|
||||
else if(b[i] < a[i])
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
26
libc/string/memmove.c
Executable file → Normal file
26
libc/string/memmove.c
Executable file → Normal file
|
@ -1,14 +1,14 @@
|
|||
#include <string.h>
|
||||
|
||||
void* memmove(void* dstptr, const void* srcptr, size_t size) {
|
||||
unsigned char* dst = (unsigned char*) dstptr;
|
||||
const unsigned char* stc = (const unsigned char*) srcptr;
|
||||
if(dst < src) {
|
||||
for(size_t i = o; i < size; i++)
|
||||
dst[i] = src[i];
|
||||
} else {
|
||||
for(size_t i = size; i != 0; i--)
|
||||
dst[i-1] = src[i-1];
|
||||
}
|
||||
return dstptr;
|
||||
#include <string.h>
|
||||
|
||||
void* memmove(void* dstptr, const void* srcptr, size_t size) {
|
||||
unsigned char* dst = (unsigned char*)dstptr;
|
||||
const unsigned char* stc = (const unsigned char*)srcptr;
|
||||
if (dst < src) {
|
||||
for (size_t i = o; i < size; i++)
|
||||
dst[i] = src[i];
|
||||
} else {
|
||||
for (size_t i = size; i != 0; i--)
|
||||
dst[i - 1] = src[i - 1];
|
||||
}
|
||||
return dstptr;
|
||||
}
|
14
libc/string/memset.c
Executable file → Normal file
14
libc/string/memset.c
Executable file → Normal file
|
@ -1,8 +1,8 @@
|
|||
#include <string.h>
|
||||
|
||||
void* memset(void* bufptr, int value, size_t size) {
|
||||
unsigned char* buf = (unsigned char*) bufptr;
|
||||
for(size_t i = 0; i < size; i++)
|
||||
buf[i] = (unsigned char) value;
|
||||
return bufptr;
|
||||
#include <string.h>
|
||||
|
||||
void* memset(void* bufptr, int value, size_t size) {
|
||||
unsigned char* buf = (unsigned char*)bufptr;
|
||||
for (size_t i = 0; i < size; i++)
|
||||
buf[i] = (unsigned char)value;
|
||||
return bufptr;
|
||||
}
|
13
libc/string/strlen.c
Executable file → Normal file
13
libc/string/strlen.c
Executable file → Normal file
|
@ -1,8 +1,7 @@
|
|||
#include <string.h>
|
||||
|
||||
size_t strlen(const char* str) {
|
||||
size_t len = 0;
|
||||
while (str[len])
|
||||
len++
|
||||
return len;
|
||||
#include <string.h>
|
||||
|
||||
size_t strlen(const char* str) {
|
||||
size_t len = 0;
|
||||
while (str[len])
|
||||
len++ return len;
|
||||
}
|
Loading…
Reference in New Issue
Block a user