diff --git a/plugins/highlighter/src/plugin.odin b/plugins/highlighter/src/plugin.odin index 46b233d..21ed6d8 100644 --- a/plugins/highlighter/src/plugin.odin +++ b/plugins/highlighter/src/plugin.odin @@ -16,8 +16,8 @@ OnInitialize :: proc "c" (plugin: Plugin) { context = runtime.default_context(); fmt.println("builtin highlighter plugin initialized!"); - plugin.register_highlighter(plugin.state, ".odin", color_buffer_odin); - plugin.register_highlighter(plugin.state, ".rs", color_buffer_rust); + plugin.register_highlighter(".odin", color_buffer_odin); + plugin.register_highlighter(".rs", color_buffer_rust); } @export @@ -31,24 +31,24 @@ OnDraw :: proc "c" (plugin: Plugin) { context = runtime.default_context(); } -iterate_buffer :: proc(state: rawptr, iter_funcs: Iterator, it: ^BufferIter) -> (character: u8, idx: BufferIndex, cond: bool) { - result := iter_funcs.iterate_buffer(state, it); +iterate_buffer :: proc(iter_funcs: Iterator, it: ^BufferIter) -> (character: u8, idx: BufferIndex, cond: bool) { + result := iter_funcs.iterate_buffer(it); return result.char, it.cursor.index, result.should_stop; } -iterate_buffer_reverse :: proc(state: rawptr, iter_funcs: Iterator, it: ^BufferIter) -> (character: u8, idx: BufferIndex, cond: bool) { - result := iter_funcs.iterate_buffer_reverse(state, it); +iterate_buffer_reverse :: proc(iter_funcs: Iterator, it: ^BufferIter) -> (character: u8, idx: BufferIndex, cond: bool) { + result := iter_funcs.iterate_buffer_reverse(it); return result.char, it.cursor.index, result.should_stop; } iterate_buffer_until :: proc(plugin: Plugin, it: ^BufferIter, until_proc: rawptr) { - plugin.iter.iterate_buffer_until(plugin.state, it, until_proc); + plugin.iter.iterate_buffer_until(it, until_proc); } iterate_buffer_peek :: proc(plugin: Plugin, it: ^BufferIter) -> (character: u8, idx: BufferIndex, cond: bool) { - result := plugin.iter.iterate_buffer_peek(plugin.state, it); + result := plugin.iter.iterate_buffer_peek(it); return result.char, it.cursor.index, result.should_stop; } @@ -165,14 +165,14 @@ is_odin_keyword :: proc(plugin: Plugin, start: BufferIter, end: BufferIter) -> ( it := start; keyword_index := 0; - for character in iterate_buffer(plugin.state, plugin.iter, &it) { + for character in iterate_buffer(plugin.iter, &it) { if character != keyword[keyword_index] { break; } keyword_index += 1; if keyword_index >= len(keyword)-1 && it == end { - if plugin.iter.get_char_at_iter(plugin.state, &it) == keyword[keyword_index] { + if plugin.iter.get_char_at_iter(&it) == keyword[keyword_index] { matches = true; } @@ -250,14 +250,14 @@ is_rust_keyword :: proc(plugin: Plugin, start: BufferIter, end: BufferIter) -> ( it := start; keyword_index := 0; - for character in iterate_buffer(plugin.state, plugin.iter, &it) { + for character in iterate_buffer(plugin.iter, &it) { if character != keyword[keyword_index] { break; } keyword_index += 1; if keyword_index >= len(keyword)-1 && it == end { - if plugin.iter.get_char_at_iter(plugin.state, &it) == keyword[keyword_index] { + if plugin.iter.get_char_at_iter(&it) == keyword[keyword_index] { matches = true; } @@ -280,12 +280,12 @@ is_rust_keyword :: proc(plugin: Plugin, start: BufferIter, end: BufferIter) -> ( color_buffer_odin :: proc "c" (plugin: Plugin, buffer: rawptr) { context = runtime.default_context(); - start_it := plugin.iter.get_buffer_iterator(plugin.state, buffer); - it := plugin.iter.get_buffer_iterator(plugin.state, buffer); + start_it := plugin.iter.get_buffer_iterator(buffer); + it := plugin.iter.get_buffer_iterator(buffer); - buffer := plugin.buffer.get_buffer_info(plugin.state); + buffer := plugin.buffer.get_buffer_info(); - for character in iterate_buffer(plugin.state, plugin.iter, &it) { + for character in iterate_buffer(plugin.iter, &it) { if it.cursor.line > buffer.glyph_buffer_height && (it.cursor.line - buffer.top_line) > buffer.glyph_buffer_height { break; } @@ -293,56 +293,56 @@ color_buffer_odin :: proc "c" (plugin: Plugin, buffer: rawptr) { if character == '/' { start_it = it; // need to go back one character because `it` is on the next character - iterate_buffer_reverse(plugin.state, plugin.iter, &start_it); + iterate_buffer_reverse(plugin.iter, &start_it); - character, _, succ := iterate_buffer(plugin.state, plugin.iter, &it); + character, _, succ := iterate_buffer(plugin.iter, &it); if !succ { break; } if character == '/' { iterate_buffer_until(plugin, &it, plugin.iter.until_line_break); - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 9); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 9); } else if character == '*' { // TODO: block comments } } else if character == '\'' { start_it = it; // need to go back one character because `it` is on the next character - iterate_buffer_reverse(plugin.state, plugin.iter, &start_it); + iterate_buffer_reverse(plugin.iter, &start_it); // jump into the quoted text iterate_buffer_until(plugin, &it, plugin.iter.until_single_quote); - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 12); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 12); - iterate_buffer(plugin.state, plugin.iter, &it); + iterate_buffer(plugin.iter, &it); } else if character == '"' { start_it = it; // need to go back one character because `it` is on the next character - iterate_buffer_reverse(plugin.state, plugin.iter, &start_it); + iterate_buffer_reverse(plugin.iter, &start_it); // jump into the quoted text iterate_buffer_until(plugin, &it, plugin.iter.until_double_quote); - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 12); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 12); - iterate_buffer(plugin.state, plugin.iter, &it); + iterate_buffer(plugin.iter, &it); } else if (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || character == '_' { start_it = it; // need to go back one character because `it` is on the next character - iterate_buffer_reverse(plugin.state, plugin.iter, &start_it); + iterate_buffer_reverse(plugin.iter, &start_it); it = start_it; iterate_buffer_until(plugin, &it, plugin.iter.until_end_of_word); if is_odin_keyword(plugin, start_it, it) { - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 13); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 13); } else if character, _, cond := iterate_buffer_peek(plugin, &it); cond { if character == '(' { - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 11); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 11); } } else { break; } - iterate_buffer(plugin.state, plugin.iter, &it); + iterate_buffer(plugin.iter, &it); } } } @@ -350,12 +350,12 @@ color_buffer_odin :: proc "c" (plugin: Plugin, buffer: rawptr) { color_buffer_rust :: proc "c" (plugin: Plugin, buffer: rawptr) { context = runtime.default_context(); - start_it := plugin.iter.get_buffer_iterator(plugin.state, buffer); - it := plugin.iter.get_buffer_iterator(plugin.state, buffer); + start_it := plugin.iter.get_buffer_iterator(buffer); + it := plugin.iter.get_buffer_iterator(buffer); - buffer := plugin.buffer.get_buffer_info(plugin.state); + buffer := plugin.buffer.get_buffer_info(); - for character in iterate_buffer(plugin.state, plugin.iter, &it) { + for character in iterate_buffer(plugin.iter, &it) { if it.cursor.line > buffer.glyph_buffer_height && (it.cursor.line - buffer.top_line) > buffer.glyph_buffer_height { break; } @@ -363,56 +363,56 @@ color_buffer_rust :: proc "c" (plugin: Plugin, buffer: rawptr) { if character == '/' { start_it = it; // need to go back one character because `it` is on the next character - iterate_buffer_reverse(plugin.state, plugin.iter, &start_it); + iterate_buffer_reverse(plugin.iter, &start_it); - character, _, succ := iterate_buffer(plugin.state, plugin.iter, &it); + character, _, succ := iterate_buffer(plugin.iter, &it); if !succ { break; } if character == '/' { iterate_buffer_until(plugin, &it, plugin.iter.until_line_break); - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 9); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 9); } else if character == '*' { // TODO: block comments } } else if character == '\'' && false { start_it = it; // need to go back one character because `it` is on the next character - iterate_buffer_reverse(plugin.state, plugin.iter, &start_it); + iterate_buffer_reverse(plugin.iter, &start_it); // jump into the quoted text iterate_buffer_until(plugin, &it, plugin.iter.until_single_quote); - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 12); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 12); - iterate_buffer(plugin.state, plugin.iter, &it); + iterate_buffer(plugin.iter, &it); } else if character == '"' { start_it = it; // need to go back one character because `it` is on the next character - iterate_buffer_reverse(plugin.state, plugin.iter, &start_it); + iterate_buffer_reverse(plugin.iter, &start_it); // jump into the quoted text iterate_buffer_until(plugin, &it, plugin.iter.until_double_quote); - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 12); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 12); - iterate_buffer(plugin.state, plugin.iter, &it); + iterate_buffer(plugin.iter, &it); } else if (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || character == '_' { start_it = it; // need to go back one character because `it` is on the next character - iterate_buffer_reverse(plugin.state, plugin.iter, &start_it); + iterate_buffer_reverse(plugin.iter, &start_it); it = start_it; iterate_buffer_until(plugin, &it, plugin.iter.until_end_of_word); if is_rust_keyword(plugin, start_it, it) { - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 13); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 13); } else if character, _, cond := iterate_buffer_peek(plugin, &it); cond { if character == '(' || character == '<' { - plugin.buffer.color_char_at(plugin.state, it.buffer, start_it.cursor, it.cursor, 11); + plugin.buffer.color_char_at(it.buffer, start_it.cursor, it.cursor, 11); } } else { break; } - iterate_buffer(plugin.state, plugin.iter, &it); + iterate_buffer(plugin.iter, &it); } } } diff --git a/src/main.odin b/src/main.odin index 7b2fc2c..4c18187 100644 --- a/src/main.odin +++ b/src/main.odin @@ -18,6 +18,8 @@ import "plugin" State :: core.State; FileBuffer :: core.FileBuffer; +state := core.State {}; + // TODO: use buffer list in state do_normal_mode :: proc(state: ^State, buffer: ^FileBuffer) { if state.current_input_map != nil { @@ -208,7 +210,7 @@ load_plugin :: proc(info: os.File_Info, in_err: os.Errno, state: rawptr) -> (err } main :: proc() { - state := State { + state = State { ctx = context, source_font_width = 8, source_font_height = 16, @@ -220,8 +222,7 @@ main :: proc() { }; state.plugin_vtable = plugin.Plugin { state = cast(rawptr)&state, - register_highlighter = proc "c" (state: rawptr, extension: cstring, on_color_buffer: plugin.OnColorBufferProc) { - state := cast(^State)state; + register_highlighter = proc "c" (extension: cstring, on_color_buffer: plugin.OnColorBufferProc) { context = state.ctx; extension := strings.clone(string(extension)); @@ -233,8 +234,7 @@ main :: proc() { } }, iter = plugin.Iterator { - get_current_buffer_iterator = proc "c" (state: rawptr) -> plugin.BufferIter { - state := cast(^State)state; + get_current_buffer_iterator = proc "c" () -> plugin.BufferIter { context = state.ctx; it := core.new_file_buffer_iter(&state.buffers[state.current_buffer]); @@ -253,8 +253,7 @@ main :: proc() { hit_end = it.hit_end, } }, - get_buffer_iterator = proc "c" (state: rawptr, buffer: rawptr) -> plugin.BufferIter { - state := cast(^State)state; + get_buffer_iterator = proc "c" (buffer: rawptr) -> plugin.BufferIter { buffer := cast(^core.FileBuffer)buffer; context = state.ctx; @@ -274,8 +273,7 @@ main :: proc() { hit_end = it.hit_end, } }, - get_char_at_iter = proc "c" (state: rawptr, it: ^plugin.BufferIter) -> u8 { - state := cast(^State)state; + get_char_at_iter = proc "c" (it: ^plugin.BufferIter) -> u8 { context = state.ctx; internal_it := core.FileBufferIter { @@ -293,8 +291,7 @@ main :: proc() { return core.get_character_at_iter(internal_it); }, - iterate_buffer = proc "c" (state: rawptr, it: ^plugin.BufferIter) -> plugin.IterateResult { - state := cast(^State)state; + iterate_buffer = proc "c" (it: ^plugin.BufferIter) -> plugin.IterateResult { context = state.ctx; // TODO: make this into a function @@ -331,8 +328,7 @@ main :: proc() { should_stop = cond, }; }, - iterate_buffer_reverse = proc "c" (state: rawptr, it: ^plugin.BufferIter) -> plugin.IterateResult { - state := cast(^State)state; + iterate_buffer_reverse = proc "c" (it: ^plugin.BufferIter) -> plugin.IterateResult { context = state.ctx; // TODO: make this into a function @@ -369,8 +365,7 @@ main :: proc() { should_stop = cond, }; }, - iterate_buffer_until = proc "c" (state: rawptr, it: ^plugin.BufferIter, until_proc: rawptr) { - state := cast(^State)state; + iterate_buffer_until = proc "c" (it: ^plugin.BufferIter, until_proc: rawptr) { context = state.ctx; // TODO: make this into a function @@ -402,8 +397,7 @@ main :: proc() { hit_end = internal_it.hit_end, }; }, - iterate_buffer_peek = proc "c" (state: rawptr, it: ^plugin.BufferIter) -> plugin.IterateResult { - state := cast(^State)state; + iterate_buffer_peek = proc "c" (it: ^plugin.BufferIter) -> plugin.IterateResult { context = state.ctx; // TODO: make this into a function @@ -446,8 +440,7 @@ main :: proc() { until_end_of_word = transmute(rawptr)core.until_end_of_word, }, buffer = plugin.Buffer { - get_buffer_info = proc "c" (state: rawptr) -> plugin.BufferInfo { - state := cast(^State)state; + get_buffer_info = proc "c" () -> plugin.BufferInfo { context = state.ctx; buffer := &state.buffers[state.current_buffer]; @@ -458,8 +451,7 @@ main :: proc() { top_line = buffer.top_line, }; }, - color_char_at = proc "c" (state: rawptr, buffer: rawptr, start_cursor: plugin.Cursor, end_cursor: plugin.Cursor, palette_index: i32) { - state := cast(^State)state; + color_char_at = proc "c" (buffer: rawptr, start_cursor: plugin.Cursor, end_cursor: plugin.Cursor, palette_index: i32) { buffer := cast(^core.FileBuffer)buffer; context = state.ctx; diff --git a/src/plugin/plugin.odin b/src/plugin/plugin.odin index 2cc654c..6db24b0 100644 --- a/src/plugin/plugin.odin +++ b/src/plugin/plugin.odin @@ -43,20 +43,20 @@ BufferInfo :: struct { } Buffer :: struct { - get_buffer_info: proc "c" (state: rawptr) -> BufferInfo, - color_char_at: proc "c" (state: rawptr, buffer: rawptr, start_cursor: Cursor, end_cursor: Cursor, palette_index: i32), + get_buffer_info: proc "c" () -> BufferInfo, + color_char_at: proc "c" (buffer: rawptr, start_cursor: Cursor, end_cursor: Cursor, palette_index: i32), } Iterator :: struct { - get_current_buffer_iterator: proc "c" (state: rawptr) -> BufferIter, - get_buffer_iterator: proc "c" (state: rawptr, buffer: rawptr) -> BufferIter, - get_char_at_iter: proc "c" (state: rawptr, it: ^BufferIter) -> u8, + get_current_buffer_iterator: proc "c" () -> BufferIter, + get_buffer_iterator: proc "c" (buffer: rawptr) -> BufferIter, + get_char_at_iter: proc "c" (it: ^BufferIter) -> u8, - iterate_buffer: proc "c" (state: rawptr, it: ^BufferIter) -> IterateResult, - iterate_buffer_reverse: proc "c" (state: rawptr, it: ^BufferIter) -> IterateResult, - iterate_buffer_until: proc "c" (state: rawptr, it: ^BufferIter, until_proc: rawptr), - iterate_buffer_until_reverse: proc "c" (state: rawptr, it: ^BufferIter, until_proc: rawptr), - iterate_buffer_peek: proc "c" (state: rawptr, it: ^BufferIter) -> IterateResult, + iterate_buffer: proc "c" (it: ^BufferIter) -> IterateResult, + iterate_buffer_reverse: proc "c" (it: ^BufferIter) -> IterateResult, + iterate_buffer_until: proc "c" (it: ^BufferIter, until_proc: rawptr), + iterate_buffer_until_reverse: proc "c" (it: ^BufferIter, until_proc: rawptr), + iterate_buffer_peek: proc "c" (it: ^BufferIter) -> IterateResult, until_line_break: rawptr, until_single_quote: rawptr, @@ -69,7 +69,7 @@ Plugin :: struct { iter: Iterator, buffer: Buffer, - register_highlighter: proc "c" (state: rawptr, extension: cstring, on_color_buffer: OnColorBufferProc), + register_highlighter: proc "c" (extension: cstring, on_color_buffer: OnColorBufferProc), } load_proc_address :: proc(lib_path: string, library: dynlib.Library, symbol: string, $ProcType: typeid) -> ProcType