lenochka/kernel_old/termio.c
2019-03-29 00:27:42 +02:00

175 lines
2.5 KiB
C

#include "termio.h"
#include "keyboard.h"
#include "vga_terminal.h"
#include "string.h"
u8 kgetch()
{
u8 key;
while(keyboard_scan_code() == 0)
{__asm("hlt");}
key = keyboard_scan_code();
keyboard_reset_irq1_vars();
return key;
}
u8 kgetc()
{
u8 ascii;
while(keyboard_scan_code() == 0)
{__asm("hlt");}
ascii = keyboard_ascii();
keyboard_reset_irq1_vars();
return ascii;
}
void kgets(char* buf,size_t max)
{
u8 ch;
char* ptr,*end;
ptr = buf;
end = buf + max;
*ptr = '\0';
while((ch = kgetc()) != '\n')
{
if(ch == '\b')
{
if(ptr != buf) *ptr-- = '\0';
printchar('\b');
}
else if(ptr != end-1)
{
*ptr++ = ch;
printchar(ch);
}
}
printchar('\n');
if(ptr == end) ptr--;
*ptr = '\0';
}
static char* katoi_base = "0123456789ABCDEF";
static i32 _katoi(char* str,int base,u32 len)
{
char* end;
i32 i,pow;
i32 num;
i = 0;
num = 0;
pow = 1;
end = str+len-1;
while(1)
{
if(*end == '-')
{
num *= -1;
break;
}
else if(*end == 'x') break;
for(i = 0; i < base; i++)
if(*end == katoi_base[i]) break;
num += i*pow;
pow *= base;
if(end == str) break;
end--;
}
return num;
}
static u32 _katou(char* str,int base,u32 len)
{
char* end;
u32 i,pow;
u32 num;
i = 0;
num = 0;
pow = 1;
end = str+len-1;
while(1)
{
if(*end == 'x') break;
for(i = 0; i < base; i++)
if(*end == katoi_base[i]) break;
num += i*pow;
pow *= base;
if(end == str) break;
end--;
}
return num;
}
i32 katoi(char* str,int base)
{
return _katoi(str,base,kstrlen(str));
}
u32 katou(char* str,int base)
{
return _katou(str,base,kstrlen(str));
}
static u32 _kstrchr_delim(char* buf,u32 base)
{
u32 i,len;
char c;
len = 0;
while(*buf)
{
c = *buf;
for(i = 0; i < base; i++)
{
if(c == katoi_base[i]) break;
}
if(i == base && c != '-') break;
buf++;
len++;
}
return len;
}
void ksscanf(char* buf,char* fmt,...)
{
u32* argp;
u32 len;
i32* iptr;
u32* uptr;
char c,*stk;
argp = ((u32*)&fmt)+1;
while((c = *fmt))
{
//kprintf("%c %c\n",c,*buf);
if(c == '%')
{
c = *++fmt;
switch(c)
{
case 'u':
case 'd':
len = _kstrchr_delim(buf,10);
iptr = (i32*)(*(u32*)argp++);
*iptr = _katoi(buf,10,len);
buf += len; //we decrement because it will +1
break;
case 'p':
case 'x':
buf += 2; //Skip 0x part
len = _kstrchr_delim(buf,16);
iptr = (i32*)(*(u32*)argp++);
*iptr = _katoi(buf,16,len);
buf += len; //we decrement because it will +1
}
} else buf++;
fmt++;
}
}