Compare commits
3 commits
5894983b65
...
6ed6094b82
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ed6094b82 | |||
| d16096b9e0 | |||
| 2d33e41d2d |
6 changed files with 67 additions and 83 deletions
1
Makefile
1
Makefile
|
|
@ -40,6 +40,7 @@ KERNEL_SOURCES := \
|
|||
src/window.c \
|
||||
src/keyboard.c \
|
||||
src/unicode.c \
|
||||
src/interpreter.c \
|
||||
$(KERNEL_SOURCES_$(ARCH)) \
|
||||
# end of kernel sources list
|
||||
|
||||
|
|
|
|||
8
include/interpreter.h
Normal file
8
include/interpreter.h
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#ifndef KARLOS_INTERPRETER_H
|
||||
#define KARLOS_INTERPRETER_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void interpret_handle_input_line(const uint8_t *s);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
#include "interpreter.h"
|
||||
#include "keyboard.h"
|
||||
#include "std.h"
|
||||
#include "console.h"
|
||||
|
|
@ -118,8 +119,15 @@ void cin_putc(uint32_t c)
|
|||
window_glyph_to_framebuffer(&cin_win, cin_cursor_y, cin_cursor_x, true);
|
||||
|
||||
// do something with string
|
||||
void cin_handle_input_line(void);
|
||||
cin_handle_input_line();
|
||||
// convert to utf-8 first
|
||||
static uint8_t current_line_utf8[CONSOLE_MAX_COLS * 4];
|
||||
uint8_t *stemp = current_line_utf8;
|
||||
unsigned int idx = 0;
|
||||
while (cin_line[idx] != 0) {
|
||||
utf8_push_terminated(&stemp, cin_line[idx]);
|
||||
idx += 1;
|
||||
}
|
||||
interpret_handle_input_line(current_line_utf8);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -194,55 +202,3 @@ void console_editor_key_event_listener(enum editor_key_event_kind kind, uint32_t
|
|||
default: UNREACHABLE();
|
||||
}
|
||||
}
|
||||
|
||||
void cin_handle_input_line() {
|
||||
// utf8-ize the current line
|
||||
static uint8_t current_line_utf8[CONSOLE_MAX_COLS * 4];
|
||||
uint8_t *stemp = current_line_utf8;
|
||||
unsigned int idx = 0;
|
||||
while (cin_line[idx] != 0) {
|
||||
utf8_push_terminated(&stemp, cin_line[idx]);
|
||||
idx += 1;
|
||||
}
|
||||
|
||||
const uint8_t *s = current_line_utf8;
|
||||
printf(">>> %s\n", s);
|
||||
if (memcmp(s, "echo", 4) == 0) {
|
||||
s += 4;
|
||||
while (*s == ' ') {
|
||||
s++;
|
||||
}
|
||||
if (*s != '"') {
|
||||
printf("expected `echo` to be followed by enquoted string\n");
|
||||
return;
|
||||
}
|
||||
s++;
|
||||
// TODO escaped double quote
|
||||
while (1) {
|
||||
glyph g = utf8_next_asserted(&s);
|
||||
if (g == 0) {
|
||||
printf("unclosed delimiter\n");
|
||||
return;
|
||||
} else if (g == '"') {
|
||||
break;
|
||||
} else if (g == '\\') {
|
||||
g = utf8_next_asserted(&s);
|
||||
if (g != 'U') {
|
||||
printf("unknown escape character\n");
|
||||
return;
|
||||
}
|
||||
// TODO error handling
|
||||
uint32_t codepoint = 0;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
codepoint = (codepoint << 4) | hexchar_to_num(utf8_next_asserted(&s));
|
||||
}
|
||||
printf("%c", codepoint);
|
||||
} else {
|
||||
printf("%c", g);
|
||||
}
|
||||
}
|
||||
putln();
|
||||
} else {
|
||||
printf("unknown command\n");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
46
src/interpreter.c
Normal file
46
src/interpreter.c
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
#include "unicode.h"
|
||||
#include "std.h"
|
||||
#include "interpreter.h"
|
||||
|
||||
void interpret_handle_input_line(const uint8_t *s) {
|
||||
|
||||
printf(">>> %s\n", s);
|
||||
if (memcmp(s, "echo", 4) == 0) {
|
||||
s += 4;
|
||||
while (*s == ' ') {
|
||||
s++;
|
||||
}
|
||||
if (*s != '"') {
|
||||
printf("expected `echo` to be followed by enquoted string\n");
|
||||
return;
|
||||
}
|
||||
s++;
|
||||
// TODO escaped double quote
|
||||
while (1) {
|
||||
unicode_char c = utf8_next_asserted(&s);
|
||||
if (c == 0) {
|
||||
printf("unclosed delimiter\n");
|
||||
return;
|
||||
} else if (c == '"') {
|
||||
break;
|
||||
} else if (c == '\\') {
|
||||
c = utf8_next_asserted(&s);
|
||||
if (c != 'U') {
|
||||
printf("unknown escape character\n");
|
||||
return;
|
||||
}
|
||||
// TODO error handling
|
||||
uint32_t codepoint = 0;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
codepoint = (codepoint << 4) | hexchar_to_num(utf8_next_asserted(&s));
|
||||
}
|
||||
printf("%c", codepoint);
|
||||
} else {
|
||||
printf("%c", c);
|
||||
}
|
||||
}
|
||||
putln();
|
||||
} else {
|
||||
printf("unknown command\n");
|
||||
}
|
||||
}
|
||||
28
src/kernel.c
28
src/kernel.c
|
|
@ -1,31 +1,3 @@
|
|||
/*
|
||||
* Copyright (C) 2017 - 2021 bzt (bztsrc@gitlab)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* This file is part of the BOOTBOOT Protocol package.
|
||||
* @brief A sample BOOTBOOT compatible kernel
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <cpuid.h>
|
||||
|
|
|
|||
|
|
@ -219,7 +219,8 @@ void port1_handler(void) {
|
|||
}
|
||||
|
||||
void port2_handler(void) {
|
||||
DEBUG_PRINTF("keycode from port 2: %X8\n", ps2_read_data());
|
||||
uint8_t data = ps2_read_data();
|
||||
DEBUG_PRINTF("keycode from port 2: %X8\n", data);
|
||||
}
|
||||
|
||||
#define PS2_INIT_PRINT
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue