make State global

plugins
Patrick Cleavelin 2024-01-05 15:46:22 -06:00
parent 434a4e74db
commit 5b9b7889c6
3 changed files with 70 additions and 78 deletions

View File

@ -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);
}
}
}

View File

@ -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;

View File

@ -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