diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/Makefile | 2 | ||||
| -rw-r--r-- | core/read.c | 96 | ||||
| -rw-r--r-- | core/tctl.c | 44 |
3 files changed, 141 insertions, 1 deletions
diff --git a/core/Makefile b/core/Makefile index 0dc6d12..d8335b0 100644 --- a/core/Makefile +++ b/core/Makefile @@ -9,7 +9,7 @@ options: objects/%: %.c -mkdir -p $$(dirname $@) - gcc $< -o $@ ../lib/slib.a -static -nostdlib -fno-stack-protector -Wno-implicit-function-declaration -fno-builtin -g + gcc $< -o $@ ../lib/slib.a -static -nostdlib -fno-stack-protector -Wno-implicit-function-declaration -fno-builtin -Wno-int-conversion -g clean: rm ${OBJ} diff --git a/core/read.c b/core/read.c new file mode 100644 index 0000000..82b74be --- /dev/null +++ b/core/read.c @@ -0,0 +1,96 @@ +#include "../lib/io/io.h" +#include "../lib/arg/arg.h" +#include "../lib/list/list.h" + +#define BUF_SIZE 1024 + +void mode_all(int fd); +void mode_singleline(int fd); + +enum Modes { + MODE_ALL, + MODE_SINGLELINE, + MODE_SIZE +} mode; + +char buf[BUF_SIZE] = ""; +list_t *files; +void(*mode_funcs[MODE_SIZE])(int fd) = { + mode_all, + mode_singleline +}; + +void add_file(const char *path) +{ + list_append(files, (void*)path); +} + + +void add_stdin() +{ + list_append(files, 0); +} + + +void set_singleline_mode() +{ + mode = MODE_SINGLELINE; +} + + +void mode_all(int fd) +{ + u64 rs; + while ((rs = read(fd, buf, BUF_SIZE - 1))) { + buf[rs] = 0; + wstd(buf); + } +} + + +void mode_singleline(int fd) +{ + u64 rs; + u64 has_newline_char = 0; + char *p; + while (!has_newline_char) { + rs = read(fd, buf, BUF_SIZE - 1); + for (p = buf; p < buf + rs; ++p) { + if (*p == '\n') { + has_newline_char = 1; + *(p + 1) = 0; + break; + } + } + wstd(buf); + } +} + + +int main(int argc, const char **argv) +{ + list_node_t *file; + int fd; + + files = new_list(); + + arg_register_default(&add_file); + arg_register_flag("-", &add_stdin); + arg_register_flag("-l", &set_singleline_mode); + arg_parse_arg(argc, argv); + + if (files->size == 0) { + list_append(files, 0); + } + + for (file = files->first; file; file = file->next) { + if (file->value) + fd = open(file->value, OPEN_READ_ONLY, 0); + else + fd = STDIN_FD; + + mode_funcs[mode](fd); + } + + free_list(files); +} diff --git a/core/tctl.c b/core/tctl.c new file mode 100644 index 0000000..e57c7cd --- /dev/null +++ b/core/tctl.c @@ -0,0 +1,44 @@ +#include "../lib/io/io.h" +#include "../lib/tctl/tctl.h" +#include "../lib/arg/arg.h" +#include "../lib/cstr/cstr.h" + +window_size_t size; + +void set_height(const char *h) +{ + size.height = cstr_to_u64(h); +} + + +void set_width(const char *h) +{ + size.width = cstr_to_u64(h); +} + + +int main(int argc, const char **argv) +{ + size.width = 0; + size.height = 0; + + arg_register_arg("-w", &set_width); + arg_register_arg("-h", &set_height); + arg_parse_arg(argc, argv); + + if (size.width == 0 && size.height == 0) { + size = tctl_get_window_size(); + wstdf("width: %u, height: %u\n", size.width, size.height); + } else { + window_size_t new_size = tctl_get_window_size(); + + if (size.width != 0) + new_size.width = size.width; + if (size.height != 0) + new_size.height = size.height; + + tctl_set_window_size(new_size); + } + + return 0; +} |