make State global
parent
434a4e74db
commit
5b9b7889c6
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue