summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlbert Cervin <albert@acervin.com>2023-04-06 21:22:53 +0200
committerAlbert Cervin <albert@acervin.com>2023-04-06 21:22:53 +0200
commitf828f30709b2ce76bf41a768aca5948459f268d2 (patch)
tree9f12af9e1880eae570f695b390a66d91efb32b3d /src
parent0006d8b9f261960074b92dde98e49872ba5673fb (diff)
downloaddged-f828f30709b2ce76bf41a768aca5948459f268d2.tar.gz
dged-f828f30709b2ce76bf41a768aca5948459f268d2.tar.xz
dged-f828f30709b2ce76bf41a768aca5948459f268d2.zip
some minor cleanup
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c65
-rw-r--r--src/buffer.h60
-rw-r--r--src/main.c52
-rw-r--r--src/settings.c12
-rw-r--r--src/settings.h13
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 <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},
-};