diff options
Diffstat (limited to 'user')
| -rw-r--r-- | user/chat.c | 33 | ||||
| -rw-r--r-- | user/hexview.c | 16 | ||||
| -rw-r--r-- | user/save.c | 34 | ||||
| -rw-r--r-- | user/user.h | 58 |
4 files changed, 106 insertions, 35 deletions
diff --git a/user/chat.c b/user/chat.c new file mode 100644 index 0000000..67bc727 --- /dev/null +++ b/user/chat.c @@ -0,0 +1,33 @@ +#include "user.h" + +void _start(const char* arg, unsigned long arglen) +{ + if (arglen == 0) + { + put("usage: run chat <path>\n"); + sys_exit(1); + } + + char path[128]; + unsigned long i = 0; + for (; i < arglen && i < sizeof(path) - 1; i++) + path[i] = arg[i]; + path[i] = 0; + + long fd = sys_open(path, 0); + if (fd < 0) + { + put("chat: "); + put(path); + put(": cannot open\n"); + sys_exit(1); + } + + char buffer[256]; + long n; + while ((n = sys_read(fd, buffer, sizeof(buffer))) > 0) + sys_write(1, buffer, (unsigned long)n); + + sys_close(fd); + sys_exit(0); +} diff --git a/user/hexview.c b/user/hexview.c index c211b44..5eac27c 100644 --- a/user/hexview.c +++ b/user/hexview.c @@ -5,7 +5,7 @@ static const char HEX[] = "0123456789abcdef"; static void put_hex8(unsigned char byte) { char digits[2] = { HEX[byte >> 4], HEX[byte & 15] }; - sys_write(digits, 2); + sys_write(1, digits, 2); } static void put_hex32(unsigned long value) @@ -13,7 +13,7 @@ static void put_hex32(unsigned long value) char digits[8]; for (int nibble = 0; nibble < 8; nibble++) digits[nibble] = HEX[(value >> ((7 - nibble) * 4)) & 15]; - sys_write(digits, 8); + sys_write(1, digits, 8); } #define PAGE 256 @@ -67,7 +67,7 @@ void _start(const char* arg, unsigned long arglen) if (row + column < count) { put_hex8((unsigned char)buffer[row + column]); - sys_write(" ", 1); + sys_write(1, " ", 1); } else put(" "); @@ -78,19 +78,19 @@ void _start(const char* arg, unsigned long arglen) { char character = buffer[row + column]; if (character >= 32 && character < 127) - sys_write(&character, 1); + sys_write(1, &character, 1); else - sys_write(".", 1); + sys_write(1, ".", 1); } put("\n"); } put("[n]ext [p]rev [q]uit (or up/down arrows) > "); - char key = (char)sys_read(); + char key = (char)get_char(); if (key == 27) // ESC { - sys_read(); - char final = (char)sys_read(); + get_char(); + char final = (char)get_char(); if (final == 'A') key = 'p'; else if (final == 'B') diff --git a/user/save.c b/user/save.c index b3664f4..48e1930 100644 --- a/user/save.c +++ b/user/save.c @@ -2,23 +2,30 @@ void _start(const char* arg, unsigned long arglen) { - if (arglen == 0 || arglen >= 64) + if (arglen == 0 || arglen >= 120) { put("usage: run save <path>\n"); sys_exit(1); } - char name[64]; + char name[128]; for (unsigned long i = 0; i < arglen; i++) name[i] = arg[i]; name[arglen] = 0; + long fd = sys_open(name, O_CREAT | O_TRUNC | O_WRONLY); + if (fd < 0) + { + put("save: "); + put(name); + put(": cannot open\n"); + sys_exit(1); + } + put("saving to "); put(name); put(" -- type lines, a single . saves\n"); - char buffer[4096]; - int length = 0; for (;;) { char line[256]; @@ -26,20 +33,13 @@ void _start(const char* arg, unsigned long arglen) put("\n"); if (n == 1 && line[0] == '.') break; - for (int i = 0; i < n && length < 4000; i++) - buffer[length++] = line[i]; - if (length < 4000) - buffer[length++] = '\n'; + sys_write(fd, line, (unsigned long)n); + sys_write(fd, "\n", 1); } - if (sys_fs_write(name, buffer, (unsigned long)length)) - { - put("saved "); - put(name); - put("\n"); - } - else - put("write failed\n"); - + sys_close(fd); + put("saved "); + put(name); + put("\n"); sys_exit(0); } diff --git a/user/user.h b/user/user.h index 635dc86..34710ac 100644 --- a/user/user.h +++ b/user/user.h @@ -1,16 +1,44 @@ -// shared syscall stubs +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 -static long sys_write(const char* buffer, unsigned long length) +#define O_WRONLY 1 +#define O_CREAT 0x40 +#define O_TRUNC 0x200 +#define O_APPEND 0x400 + +static long sys_write(long fd, const char* buffer, unsigned long length) +{ + long result; + __asm__ volatile("int $0x80" : "=a"(result) : "a"(1L), "D"(fd), "S"(buffer), "d"(length) : "memory"); + return result; +} + +static long sys_read(long fd, char* buffer, unsigned long length) +{ + long result; + __asm__ volatile("int $0x80" : "=a"(result) : "a"(2L), "D"(fd), "S"(buffer), "d"(length) : "memory"); + return result; +} + +static long sys_open(const char* path, long flags) +{ + long result; + __asm__ volatile("int $0x80" : "=a"(result) : "a"(7L), "D"(path), "S"(flags) : "memory"); + return result; +} + +static long sys_close(long fd) { long result; - __asm__ volatile("int $0x80" : "=a"(result) : "a"(1L), "D"(buffer), "S"(length) : "memory"); + __asm__ volatile("int $0x80" : "=a"(result) : "a"(8L), "D"(fd) : "memory"); return result; } -static long sys_read(void) +static long sys_lseek(long fd, long offset, long whence) { long result; - __asm__ volatile("int $0x80" : "=a"(result) : "a"(2L) : "memory"); + __asm__ volatile("int $0x80" : "=a"(result) : "a"(9L), "D"(fd), "S"(offset), "d"(whence) : "memory"); return result; } @@ -52,7 +80,15 @@ static void put(const char* string) unsigned long length = 0; while (string[length]) length++; - sys_write(string, length); + sys_write(1, string, length); +} + +static int get_char(void) +{ + char c; + if (sys_read(0, &c, 1) <= 0) + return -1; + return (unsigned char)c; } static int read_line(char* buffer, int max_length) @@ -60,7 +96,9 @@ static int read_line(char* buffer, int max_length) int length = 0; for (;;) { - char character = (char)sys_read(); + char character; + if (sys_read(0, &character, 1) <= 0) + break; if (character == '\n') break; if (character == '\b') @@ -68,14 +106,14 @@ static int read_line(char* buffer, int max_length) if (length > 0) { length--; - sys_write("\b \b", 3); + sys_write(1, "\b \b", 3); } continue; } if (length < max_length - 1) { buffer[length++] = character; - sys_write(&character, 1); + sys_write(1, &character, 1); } } buffer[length] = 0; @@ -108,5 +146,5 @@ static void put_int(long value) buffer[right] = swap; } - sys_write(buffer, length); + sys_write(1, buffer, length); } |
