add basic support of scanf, get ...

This commit is contained in:
Marian Ohligs 2011-05-23 12:56:14 +02:00
parent 34641f4338
commit 4f0bc05a74
5 changed files with 49 additions and 21 deletions

View file

@ -43,6 +43,16 @@ extern "C" {
*/
void keyboard_init(void);
typedef struct
{
char* buffer;
size_t maxsize;
size_t size;
tid_t tid;
} kb_buffer_t;
kb_buffer_t kb_buffer;
#endif
#ifdef __cplusplus

View file

@ -24,6 +24,16 @@
#ifdef CONFIG_KEYBOARD
kb_buffer_t kb_buffer = {NULL, 0, 0, 0 };
kb_flush() {
kfree(kb_buffer.buffer, (kb_buffer.maxsize * sizeof(char)));
kb_buffer.buffer = NULL;
kb_buffer.size = 0;
kb_buffer.maxsize = 0;
kb_buffer.tid = 0;
}
/*
* KBDUS means US Keyboard Layout. This is a scancode table
* used to layout a standard US keyboard. I have left some
@ -99,6 +109,15 @@ static void keyboard_handler(struct state *r)
* you would add 128 to the scancode when you look for it
*/
kputchar(kbdus[scancode]);
if (kb_buffer.size <= kb_buffer.maxsize) {
memcpy(kb_buffer.buffer + kb_buffer.size, &kbdus[scancode], 1);
kb_buffer.size++;
}
if (scancode == 28 || scancode == 15 || kb_buffer.size >= kb_buffer.maxsize) {
wakeup_task(kb_buffer.tid);
reschedule();
}
}
}

View file

@ -23,14 +23,27 @@
#include <metalsvm/errno.h>
#include <metalsvm/fs.h>
#include <metalsvm/spinlock.h>
#include <asm/kb.h>
/* Implementation of a simple stdin device */
static ssize_t stdin_read(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset)
{
while(size) {
size -= kputs((char*)buffer);
}
kb_buffer.buffer = kmalloc(size * sizeof(char));
kb_buffer.maxsize = size;
kb_buffer.size = 0;
kb_buffer.tid = per_core(current_task)->id;
block_task(per_core(current_task)->id);
reschedule();
size = kb_buffer.size;
memcpy(buffer, kb_buffer.buffer, size);
/*cleaning up */
kb_flush();
//kprintf("Size: %i, offset: %i, buffer: %s", size, buffer, offset);
return size;
}

View file

@ -144,7 +144,6 @@ static ssize_t initrd_write(vfs_node_t* node, uint8_t* buffer, size_t size, off_
* for the next block.
*/
memcpy(data + offset, buffer, size);
return size;
}

View file

@ -28,22 +28,9 @@ extern int errno;
int main(int argc, char** argv)
{
int i;
long offset_x = 5;
char* str = (char *)malloc(50 * sizeof(char));
FILE* testfile;
testfile = fopen("/bin/test", "w+r");
setbuf(testfile, NULL);
char* str = (char *)malloc(40000 * sizeof(char));
scanf("%s", str);
printf("SCANF: %s", str);
fflush(NULL);
fwrite("wsx", 3, 1, testfile);
fseek(testfile, 2, SEEK_CUR);
fwrite("nextnextnext", 1, 10, testfile);
fclose(testfile);
testfile = fopen("/bin/test", "w+r");
setbuf(testfile, NULL);
fread(str, 2, 40, testfile);
printf("reading (/bin/test):%s\n", str);
return errno;
return errno;
}