diff options
| author | Albert Cervin <albert@acervin.com> | 2023-04-06 21:22:53 +0200 |
|---|---|---|
| committer | Albert Cervin <albert@acervin.com> | 2023-04-06 21:22:53 +0200 |
| commit | f828f30709b2ce76bf41a768aca5948459f268d2 (patch) | |
| tree | 9f12af9e1880eae570f695b390a66d91efb32b3d | |
| parent | 0006d8b9f261960074b92dde98e49872ba5673fb (diff) | |
| download | dged-f828f30709b2ce76bf41a768aca5948459f268d2.tar.gz dged-f828f30709b2ce76bf41a768aca5948459f268d2.tar.xz dged-f828f30709b2ce76bf41a768aca5948459f268d2.zip | |
some minor cleanup
| -rw-r--r-- | src/buffer.c | 65 | ||||
| -rw-r--r-- | src/buffer.h | 60 | ||||
| -rw-r--r-- | src/main.c | 52 | ||||
| -rw-r--r-- | src/settings.c | 12 | ||||
| -rw-r--r-- | 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}, -}; @@ -1,3 +1,4 @@ +#include <getopt.h> #include <locale.h> #include <signal.h> #include <stdbool.h> @@ -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 <stdbool.h> #include <stdint.h> +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}, -}; |
