diff options
| author | Albert Cervin <albert@acervin.com> | 2023-04-06 23:23:46 +0200 |
|---|---|---|
| committer | Albert Cervin <albert@acervin.com> | 2023-05-01 22:19:14 +0200 |
| commit | a123725a12e948d78badb2cb686d38548f1c633b (patch) | |
| tree | c92c46134ef5536fbbf3bf08983c4f0dea1aaf58 /src/lang.c | |
| parent | b5ed4cf757afc50afb6ac499eee7b87a2648fa4c (diff) | |
| download | dged-a123725a12e948d78badb2cb686d38548f1c633b.tar.gz dged-a123725a12e948d78badb2cb686d38548f1c633b.tar.xz dged-a123725a12e948d78badb2cb686d38548f1c633b.zip | |
Implement window handling
Also implement searching.
fix undo boundaries
when it checked for other save point, it used && instead of == which
caused it to overwrite other types.
Fix bytes vs chars bug in text_get_region
Diffstat (limited to 'src/lang.c')
| -rw-r--r-- | src/lang.c | 160 |
1 files changed, 0 insertions, 160 deletions
diff --git a/src/lang.c b/src/lang.c deleted file mode 100644 index 6919780..0000000 --- a/src/lang.c +++ /dev/null @@ -1,160 +0,0 @@ -#include "lang.h" -#include "minibuffer.h" -#include "settings.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -void define_lang(const char *name, const char *id, const char *extensions, - uint32_t tab_width, const char *lang_srv) { - char namebuf[128] = {0}; - - size_t offs = snprintf(namebuf, 128, "languages.%s.", id); - - char *b = namebuf + offs; - snprintf(b, 128 - offs, "%s", "extensions"); - settings_register_setting( - namebuf, (struct setting_value){.type = Setting_String, - .string_value = (char *)extensions}); - - snprintf(b, 128 - offs, "%s", "tab-width"); - settings_register_setting(namebuf, - (struct setting_value){.type = Setting_Number, - .number_value = tab_width}); - - snprintf(b, 128 - offs, "%s", "lang-srv"); - settings_register_setting( - namebuf, (struct setting_value){.type = Setting_String, - .string_value = (char *)lang_srv}); - - snprintf(b, 128 - offs, "%s", "name"); - settings_register_setting( - namebuf, (struct setting_value){.type = Setting_String, - .string_value = (char *)name}); -} - -static struct language g_fundamental = { - .name = "Fundamental", - .tab_width = 4, - .lang_srv = NULL, -}; - -void languages_init(bool register_default) { - if (register_default) { - define_lang("C", "c", "c h", 2, "clangd"); - define_lang("C++", "cxx", "cpp cxx cc c++ hh h", 2, "clangd"); - define_lang("Rust", "rs", "rs", 4, "rust-analyzer"); - define_lang("Nix", "nix", "nix", 4, "rnix-lsp"); - } -} - -struct language lang_from_settings(const char *lang_path) { - char setting_name_buf[128] = {0}; - size_t offs = snprintf(setting_name_buf, 128, "%s.", lang_path); - char *b = setting_name_buf + offs; - - struct language l; - - snprintf(b, 128 - offs, "%s", "name"); - struct setting *name = settings_get(setting_name_buf); - l.name = name != NULL ? name->value.string_value : "Unknown"; - - snprintf(b, 128 - offs, "%s", "tab-width"); - struct setting *tab_width = settings_get(setting_name_buf); - - // fall back to global value - if (tab_width == NULL) { - tab_width = settings_get("editor.tab-width"); - } - l.tab_width = tab_width != NULL ? tab_width->value.number_value : 4; - - snprintf(b, 128 - offs, "%s", "lang-srv"); - struct setting *lang_srv = settings_get(setting_name_buf); - l.lang_srv = lang_srv->value.string_value; - - return l; -} - -void next_ext(const char *curr, const char **nxt, const char **end) { - if (curr == NULL) { - *nxt = *end = NULL; - return; - } - - *nxt = curr; - *end = curr + strlen(curr); - - const char *spc = strchr(curr, ' '); - if (spc != NULL) { - *end = spc; - } -} - -struct language lang_from_extension(const char *ext) { - - uint32_t extlen = strlen(ext); - if (extlen == 0) { - return g_fundamental; - } - - // get "languages.*" settings - struct setting **settings = NULL; - uint32_t nsettings = 0; - settings_get_prefix("languages.", &settings, &nsettings); - - // find the first one with a matching extension list - for (uint32_t i = 0; i < nsettings; ++i) { - struct setting *setting = settings[i]; - char *setting_name = strrchr(setting->path, '.'); - if (setting_name != NULL && - strncmp(setting_name + 1, "extensions", 10) == 0) { - const char *val = setting->value.string_value; - - // go over extensions - const char *cext = val, *nxt = NULL, *end = NULL; - next_ext(cext, &nxt, &end); - while (nxt != end) { - if (extlen == (end - nxt) && strncmp(ext, nxt, (end - nxt)) == 0) { - char lang_path[128] = {0}; - strncpy(lang_path, setting->path, setting_name - setting->path); - - free(settings); - return lang_from_settings(lang_path); - } - - cext = end + 1; - next_ext(cext, &nxt, &end); - } - } - } - - free(settings); - - // fall back to fundamental - return g_fundamental; -} - -struct language lang_from_id(const char *id) { - if (id == NULL || (strlen(id) == 3 && strncmp(id, "fnd", 3) == 0) || - strlen(id) == 0) { - return g_fundamental; - } - - char lang_path[128] = {0}; - snprintf(lang_path, 128, "languages.%s", id); - - // check that it exists - struct setting **settings = NULL; - uint32_t nsettings = 0; - - settings_get_prefix(lang_path, &settings, &nsettings); - free(settings); - - if (nsettings > 0) { - return lang_from_settings(lang_path); - } else { - minibuffer_echo_timeout(4, "failed to find language \"%s\"", id); - return lang_from_settings("languages.fnd"); - } -} |
