aboutsummaryrefslogtreecommitdiff
path: root/src/libs/stdio.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/stdio.cc')
-rw-r--r--src/libs/stdio.cc123
1 files changed, 123 insertions, 0 deletions
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);
+}