From f828f30709b2ce76bf41a768aca5948459f268d2 Mon Sep 17 00:00:00 2001 From: Albert Cervin Date: Thu, 6 Apr 2023 21:22:53 +0200 Subject: some minor cleanup --- src/buffer.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/buffer.h | 60 +---------------------------------------------------- src/main.c | 52 +++++++++++++++++++++++++++++++++++++--------- src/settings.c | 12 ++++++++++- src/settings.h | 13 +++--------- 5 files changed, 120 insertions(+), 82 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index ef86c32..9e181e5 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -152,7 +152,39 @@ void buffer_clear(struct buffer *buffer) { buffer->dot.col = buffer->dot.line = 0; } -void buffer_static_init() { +#define BUFFER_WRAPCMD(fn) \ + static int32_t fn##_cmd(struct command_ctx ctx, int argc, \ + const char *argv[]) { \ + fn(ctx.active_window->buffer); \ + return 0; \ + } + +// commands +BUFFER_WRAPCMD(buffer_kill_line); +BUFFER_WRAPCMD(buffer_forward_delete_char); +BUFFER_WRAPCMD(buffer_backward_delete_char); +BUFFER_WRAPCMD(buffer_backward_char); +BUFFER_WRAPCMD(buffer_backward_word); +BUFFER_WRAPCMD(buffer_forward_char); +BUFFER_WRAPCMD(buffer_forward_word); +BUFFER_WRAPCMD(buffer_backward_line); +BUFFER_WRAPCMD(buffer_forward_line); +BUFFER_WRAPCMD(buffer_end_of_line); +BUFFER_WRAPCMD(buffer_beginning_of_line); +BUFFER_WRAPCMD(buffer_newline); +BUFFER_WRAPCMD(buffer_indent); +BUFFER_WRAPCMD(buffer_to_file); +BUFFER_WRAPCMD(buffer_set_mark); +BUFFER_WRAPCMD(buffer_clear_mark); +BUFFER_WRAPCMD(buffer_copy); +BUFFER_WRAPCMD(buffer_cut); +BUFFER_WRAPCMD(buffer_paste); +BUFFER_WRAPCMD(buffer_paste_older); +BUFFER_WRAPCMD(buffer_goto_beginning); +BUFFER_WRAPCMD(buffer_goto_end); +BUFFER_WRAPCMD(buffer_undo); + +void buffer_static_init(struct commands *commands) { settings_register_setting( "editor.tab-width", (struct setting_value){.type = Setting_Number, .number_value = 4}); @@ -160,6 +192,35 @@ void buffer_static_init() { settings_register_setting( "editor.show-whitespace", (struct setting_value){.type = Setting_Bool, .bool_value = true}); + + static struct command buffer_commands[] = { + {.name = "kill-line", .fn = buffer_kill_line_cmd}, + {.name = "delete-char", .fn = buffer_forward_delete_char_cmd}, + {.name = "backward-delete-char", .fn = buffer_backward_delete_char_cmd}, + {.name = "backward-char", .fn = buffer_backward_char_cmd}, + {.name = "backward-word", .fn = buffer_backward_word_cmd}, + {.name = "forward-char", .fn = buffer_forward_char_cmd}, + {.name = "forward-word", .fn = buffer_forward_word_cmd}, + {.name = "backward-line", .fn = buffer_backward_line_cmd}, + {.name = "forward-line", .fn = buffer_forward_line_cmd}, + {.name = "end-of-line", .fn = buffer_end_of_line_cmd}, + {.name = "beginning-of-line", .fn = buffer_beginning_of_line_cmd}, + {.name = "newline", .fn = buffer_newline_cmd}, + {.name = "indent", .fn = buffer_indent_cmd}, + {.name = "buffer-write-to-file", .fn = buffer_to_file_cmd}, + {.name = "set-mark", .fn = buffer_set_mark_cmd}, + {.name = "clear-mark", .fn = buffer_clear_mark_cmd}, + {.name = "copy", .fn = buffer_copy_cmd}, + {.name = "cut", .fn = buffer_cut_cmd}, + {.name = "paste", .fn = buffer_paste_cmd}, + {.name = "paste-older", .fn = buffer_paste_older_cmd}, + {.name = "goto-beginning", .fn = buffer_goto_beginning_cmd}, + {.name = "goto-end", .fn = buffer_goto_end_cmd}, + {.name = "undo", .fn = buffer_undo_cmd}, + }; + + register_commands(commands, buffer_commands, + sizeof(buffer_commands) / sizeof(buffer_commands[0])); } void buffer_static_teardown() { @@ -269,7 +330,7 @@ bool moveh(struct buffer *buffer, int coldelta) { } void buffer_goto(struct buffer *buffer, uint32_t line, uint32_t col) { - int64_t linedelta = (int64_t)line - (int64_t)buffer->dot.line; + int64_t linedelta = (int64_t)line - 1 - (int64_t)buffer->dot.line; movev(buffer, linedelta); int64_t coldelta = (int64_t)col - (int64_t)buffer->dot.col; diff --git a/src/buffer.h b/src/buffer.h index 0eb6287..85518f5 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -145,7 +145,7 @@ struct buffer { struct buffer buffer_create(char *name, bool modeline); void buffer_destroy(struct buffer *buffer); -void buffer_static_init(); +void buffer_static_init(struct commands *commands); void buffer_static_teardown(); uint32_t buffer_keymaps(struct buffer *buffer, struct keymap **keymaps_out); @@ -199,61 +199,3 @@ void buffer_write_to(struct buffer *buffer, const char *filename); void buffer_update(struct buffer *buffer, uint32_t width, uint32_t height, struct command_list *commands, uint64_t frame_time, uint32_t *relline, uint32_t *relcol); - -// commands -#define BUFFER_WRAPCMD(fn) \ - static int32_t fn##_cmd(struct command_ctx ctx, int argc, \ - const char *argv[]) { \ - fn(ctx.active_window->buffer); \ - return 0; \ - } - -BUFFER_WRAPCMD(buffer_kill_line); -BUFFER_WRAPCMD(buffer_forward_delete_char); -BUFFER_WRAPCMD(buffer_backward_delete_char); -BUFFER_WRAPCMD(buffer_backward_char); -BUFFER_WRAPCMD(buffer_backward_word); -BUFFER_WRAPCMD(buffer_forward_char); -BUFFER_WRAPCMD(buffer_forward_word); -BUFFER_WRAPCMD(buffer_backward_line); -BUFFER_WRAPCMD(buffer_forward_line); -BUFFER_WRAPCMD(buffer_end_of_line); -BUFFER_WRAPCMD(buffer_beginning_of_line); -BUFFER_WRAPCMD(buffer_newline); -BUFFER_WRAPCMD(buffer_indent); -BUFFER_WRAPCMD(buffer_to_file); -BUFFER_WRAPCMD(buffer_set_mark); -BUFFER_WRAPCMD(buffer_clear_mark); -BUFFER_WRAPCMD(buffer_copy); -BUFFER_WRAPCMD(buffer_cut); -BUFFER_WRAPCMD(buffer_paste); -BUFFER_WRAPCMD(buffer_paste_older); -BUFFER_WRAPCMD(buffer_goto_beginning); -BUFFER_WRAPCMD(buffer_goto_end); -BUFFER_WRAPCMD(buffer_undo); - -static struct command BUFFER_COMMANDS[] = { - {.name = "kill-line", .fn = buffer_kill_line_cmd}, - {.name = "delete-char", .fn = buffer_forward_delete_char_cmd}, - {.name = "backward-delete-char", .fn = buffer_backward_delete_char_cmd}, - {.name = "backward-char", .fn = buffer_backward_char_cmd}, - {.name = "backward-word", .fn = buffer_backward_word_cmd}, - {.name = "forward-char", .fn = buffer_forward_char_cmd}, - {.name = "forward-word", .fn = buffer_forward_word_cmd}, - {.name = "backward-line", .fn = buffer_backward_line_cmd}, - {.name = "forward-line", .fn = buffer_forward_line_cmd}, - {.name = "end-of-line", .fn = buffer_end_of_line_cmd}, - {.name = "beginning-of-line", .fn = buffer_beginning_of_line_cmd}, - {.name = "newline", .fn = buffer_newline_cmd}, - {.name = "indent", .fn = buffer_indent_cmd}, - {.name = "buffer-write-to-file", .fn = buffer_to_file_cmd}, - {.name = "set-mark", .fn = buffer_set_mark_cmd}, - {.name = "clear-mark", .fn = buffer_clear_mark_cmd}, - {.name = "copy", .fn = buffer_copy_cmd}, - {.name = "cut", .fn = buffer_cut_cmd}, - {.name = "paste", .fn = buffer_paste_cmd}, - {.name = "paste-older", .fn = buffer_paste_older_cmd}, - {.name = "goto-beginning", .fn = buffer_goto_beginning_cmd}, - {.name = "goto-end", .fn = buffer_goto_end_cmd}, - {.name = "undo", .fn = buffer_undo_cmd}, -}; diff --git a/src/main.c b/src/main.c index 427f677..40de819 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -8,6 +9,8 @@ #include "allocator.h" #include "binding.h" +#include "bits/getopt_core.h" +#include "bits/getopt_ext.h" #include "buffer.h" #include "buffers.h" #include "display.h" @@ -76,19 +79,49 @@ uint64_t calc_frame_time_ns(struct timespec *timers, uint32_t num_timer_pairs) { return total; } +void usage() { printf("TODO: print usage\n"); } + int main(int argc, char *argv[]) { + + static struct option longopts[] = {{"line", required_argument, NULL, 'l'}, + {"end", no_argument, NULL, 'e'}, + {NULL, 0, NULL, 0}}; + char *filename = NULL; - if (argc >= 1) { - filename = argv[1]; + uint32_t jumpline = 0; + bool goto_end = false; + char ch; + while ((ch = getopt_long(argc, argv, "el:", longopts, NULL)) != -1) { + switch (ch) { + case 'l': + jumpline = atoi(optarg); + break; + case 'e': + goto_end = true; + break; + default: + usage(); + return 1; + } + } + argc -= optind; + argv += optind; + + if (argc > 1) { + fprintf(stderr, "More than one file to open is not supported\n"); + return 2; + } else if (argc == 1) { + filename = strdup(argv[0]); } setlocale(LC_ALL, ""); signal(SIGTERM, terminate); - settings_init(64); + struct commands commands = command_registry_create(32); + settings_init(64, &commands); languages_init(true); - buffer_static_init(); + buffer_static_init(&commands); frame_allocator = frame_allocator_create(16 * 1024 * 1024); @@ -103,14 +136,9 @@ int main(int argc, char *argv[]) { // init keyboard struct keyboard kbd = keyboard_create(reactor); - // commands - struct commands commands = command_registry_create(32); + // global commands, TODO: move these, they should exist even if main does not register_commands(&commands, GLOBAL_COMMANDS, sizeof(GLOBAL_COMMANDS) / sizeof(GLOBAL_COMMANDS[0])); - register_commands(&commands, BUFFER_COMMANDS, - sizeof(BUFFER_COMMANDS) / sizeof(BUFFER_COMMANDS[0])); - register_commands(&commands, SETTINGS_COMMANDS, - sizeof(SETTINGS_COMMANDS) / sizeof(SETTINGS_COMMANDS[0])); // keymaps struct keymap *current_keymap = NULL; @@ -139,6 +167,10 @@ int main(int argc, char *argv[]) { if (filename != NULL) { buffer_destroy(&initial_buffer); initial_buffer = buffer_from_file(filename); + if (goto_end) { + buffer_goto_end(&initial_buffer); + } else + buffer_goto(&initial_buffer, jumpline, 0); } else { const char *welcome_txt = "Welcome to the editor for datagubbar 👴\n"; buffer_add_text(&initial_buffer, (uint8_t *)welcome_txt, diff --git a/src/settings.c b/src/settings.c index 4bbcf44..7d3fcf1 100644 --- a/src/settings.c +++ b/src/settings.c @@ -11,8 +11,18 @@ static struct settings g_settings = {0}; -void settings_init(uint32_t initial_capacity) { +int32_t settings_get_cmd(struct command_ctx ctx, int argc, const char *argv[]); +int32_t settings_set_cmd(struct command_ctx ctx, int argc, const char *argv[]); + +void settings_init(uint32_t initial_capacity, struct commands *commands) { HASHMAP_INIT(&g_settings.settings, initial_capacity, hash_name); + static struct command settings_commands[] = { + {.name = "set", .fn = settings_set_cmd}, + {.name = "get", .fn = settings_get_cmd}, + }; + + register_commands(commands, settings_commands, + sizeof(settings_commands) / sizeof(settings_commands[0])); } void settings_destroy() { diff --git a/src/settings.h b/src/settings.h index a2387ed..20cca24 100644 --- a/src/settings.h +++ b/src/settings.h @@ -1,9 +1,10 @@ -#include "command.h" #include "hashmap.h" #include #include +struct commands; + /** * The type of setting value. */ @@ -68,7 +69,7 @@ struct settings { * @param initial_capacity Initial capacity of the settings collection. * @returns Nothing, the settings collection is a global instance. */ -void settings_init(uint32_t initial_capacity); +void settings_init(uint32_t initial_capacity, struct commands *commands); /** * Destroy the global collection of settings. @@ -116,11 +117,3 @@ void settings_get_prefix(const char *prefix, struct setting **settings_out[], * type for the setting. If not, the new value is ignored. */ void settings_set(const char *path, struct setting_value value); - -int32_t settings_get_cmd(struct command_ctx ctx, int argc, const char *argv[]); -int32_t settings_set_cmd(struct command_ctx ctx, int argc, const char *argv[]); - -static struct command SETTINGS_COMMANDS[] = { - {.name = "set", .fn = settings_set_cmd}, - {.name = "get", .fn = settings_get_cmd}, -}; -- cgit v1.2.3