175 lines
2.5 KiB
C
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++;
|
|
}
|
|
}
|