From d9443c7fdf756212bb52ffc934b1166038bc2ad3 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Wed, 21 Apr 2021 12:23:54 +0200 Subject: Refactoring --- src/libs/stdio.cc | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/libs/stdio.cc (limited to 'src/libs/stdio.cc') diff --git a/src/libs/stdio.cc b/src/libs/stdio.cc new file mode 100644 index 0000000..4a20c05 --- /dev/null +++ b/src/libs/stdio.cc @@ -0,0 +1,123 @@ +#include "stdio.hpp" +#include "drivers/framebuffer.hpp" +#include "math.hpp" +#include "string.hpp" + +extern VIDEO_STATE VS; +void (*__putchar)(char)=putchar; + +void printk(char *str,...) { + u64 rsi,rdx,rcx,r8,r9; + u64* rbp; + asm( "mov %%rsi, %0": "=a"(rsi)); + asm( "mov %%rdx, %0": "=a"(rdx)); + asm( "mov %%rcx, %0": "=a"(rcx)); + asm( "mov %%r8, %0": "=a"(r8)); + asm( "mov %%r9, %0": "=a"(r9)); + asm( "mov %%rbp, %0": "=a"(rbp)); + + // Init informations + int len=strlen(str); + int i=0; // Pointer to the current character + int p=1; // Pointer to the current parameter + + while (i!=len) { + char c=str[i]; + // Check if special char is comming + if(str[i]=='%'){ + char c2=str[i+1]; + char c3=str[i+2]; + // First just consider the data as a void pointer + u64 data; + switch (p) { + case 1: + data=rsi; + break; + case 2: + data=rdx; + break; + case 3: + data=rcx; + break; + case 4: + data=r8; + break; + case 5: + data=r9; + break; + default: + data=*(rbp+2+p-6); + } + + if(c2=='%'){ + __putchar('%'); + i++; + } + else if (c2=='d') { + int data_int=(int)data; + printi(data_int); + i++; + p++; + } + else if (c2=='s') { + print((char*)data); + i++; + p++; + } + else if (c2=='x') { + print("0x"); + printh(data); + i++; + p++; + } + else if (c2=='l' && c3=='l') { + printi(data); // TODO: Print 64bit number + i+=2; + p++; + } + } + else{ + __putchar(c); + } + i++; + } +} + +void print(char *s){ + int i=0; + while(s[i]!='\0'){ + __putchar(s[i]); + i++; + } +} + +void printc(char *str, VIDEO_COLORS c) { + VIDEO_COLORS backup = (VIDEO_COLORS)VS.fg; + VS.fg = c; + print(str); + VS.fg = backup; +} + +void printi(int i) { + char str[12]; + itoa(i, str); + print(str); +} + +void printh(int h) { + char str[17]; + itoh(h, str); + print(str); +} +void printh(int h, int size) { + char str[17]; + char str2[17]; + itoh(h, str); + int a = 0; + for (int i = min(max(16 - size, 0), 15); i < 16; i++) { + str2[a] = str[i]; + a++; + } + str2[a] = '\0'; + print(str2); +} -- cgit v1.2.3