Fixing tests, Fixed buffer dealloc bug, fixed clipboard bug

This commit is contained in:
Krzosa Karol
2025-12-03 10:38:27 +01:00
parent e34c2b0cef
commit 05f0197d50
14 changed files with 513 additions and 199 deletions

View File

@@ -21,10 +21,12 @@ Things I like:
- Lua config files work pretty well
Splits:
- Buffer16.cpp / h vs Buffer ?
- Buffer16 Buffer8?
- Why constraint that name of buffer needs to be unique? For Open() and default behavior but is this required?
- Try to add Tracking Allocator and rewrite the app, free all memory at the end of the app and check all is well
- SpawnProcess wrong memory allocation there
- Trying to fix the testing, Command_Open doesn't work on first frame because window is not metricly OK?
- window->document_rect is null

View File

@@ -321,7 +321,7 @@ API void *BlockArenaAllocatorProc(void *object, int kind, void *p, size_t size)
return NULL;
}
void TestArena() {
void RunArenaTest() {
Allocator memory_tracking_allocator = GetTrackingAllocator();
{
BlockArena arena = {};

View File

@@ -185,7 +185,7 @@ API String16 TrimEnd(String16 string) {
API String16 Copy16(Allocator allocator, String16 string) {
char16_t *copy = (char16_t *)AllocSize(allocator, sizeof(char16_t) * (string.len + 1));
memcpy(copy, string.data, string.len);
memcpy(copy, string.data, string.len * sizeof(char16_t));
copy[string.len] = 0;
String16 result = {copy, string.len};
return result;
@@ -332,10 +332,10 @@ API String16 Merge(Allocator allocator, Array<String16> list, String16 separator
String16 string = {buff, 0};
For(list) {
Assert(string.len + it.len <= size);
memcpy(string.data + string.len, it.data, it.len);
memcpy(string.data + string.len, it.data, it.len * sizeof(char16_t));
string.len += it.len;
if (!IsLast(list, it)) {
memcpy(string.data + string.len, separator.data, separator.len);
memcpy(string.data + string.len, separator.data, separator.len * sizeof(char16_t));
string.len += separator.len;
}
}

View File

@@ -1,4 +1,5 @@
String TestDir;
BlockArena TestArena;
void AddCtrlPress(SDL_Keycode key) {
Event event = {};
@@ -19,88 +20,130 @@ void AddText(String string) {
}
void Wait(mco_coro *co) {
Add(&EventPlayback, {111});
for (Event *event = CoYield(co); event->kind != 111; event = CoYield(co)) {
Add(&EventPlayback, {EVENT_KIND_INVALID});
for (Event *event = CoYield(co); event->kind != EVENT_KIND_INVALID; event = CoYield(co)) {
}
}
void PlayTestOpen(mco_coro *co) {
// Open file, move a little, then open again and verify the caret didn't move
String basic_env_cpp = Format(SysAllocator, "%S/basic_env/basic_env.cpp", TestDir);
// String basic_env_cpp = Format(SysAllocator, "%S/test_env", TestDir);
AddCtrlPress(SDLK_P);
Add(&EventPlayback, {EVENT_KEY_PRESS, SDLK_UP, 1280, 720});
AddCtrlPress(SDLK_Q);
Wait(co);
// AddCtrlPress(SDLK_P);
// Add(&EventPlayback, {EVENT_KEY_PRESS, SDLK_UP, 1280, 720});
// AddCtrlPress(SDLK_Q);
{
BSet main = GetActiveMainSet();
Assert(main.buffer->name == basic_env_cpp);
Assert(main.view->carets[0].range.min == 0);
Assert(main.view->carets[0].range.max == 0);
Int line = PosToLine(main.buffer, main.view->carets[0].range.min);
Assert(line == 0);
}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_PERIOD; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_PERIOD; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_F; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_S; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "s"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_R; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "r"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_C; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "c"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_Q; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_F; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_T; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "t"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_E; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "e"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_S; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "s"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_T; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "t"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_Q; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_F; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_T; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "t"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_E; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "e"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_S; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_TEXT_INPUT; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.text = "s"; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_ESCAPE; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_LCTRL; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
// {Event ev = {};ev.kind = EVENT_KEY_PRESS; ev.key = SDLK_Q; ev.xwindow = 1910; ev.ywindow = 2040; ev.xmouse = 581; ev.ymouse = 952; ev.ctrl = 1; Add(&EventPlayback, ev);}
AddCtrlPress(SDLK_DOWN);
AddCtrlPress(SDLK_DOWN);
AddCtrlPress(SDLK_DOWN);
Wait(co);
// Wait(co);
Range range = {};
{
BSet main = GetActiveMainSet();
Assert(main.view->carets[0].range.min > 0);
Assert(main.view->carets[0].range.max > 0);
range = main.view->carets[0].range;
}
// {
// BSet main = GetActiveMainSet();
// Assert(main.buffer->name == basic_env_cpp);
// Assert(main.view->carets[0].range.min == 0);
// Assert(main.view->carets[0].range.max == 0);
// Int line = PosToLine(main.buffer, main.view->carets[0].range.min);
// Assert(line == 0);
// }
AddCtrlPress(SDLK_P);
Add(&EventPlayback, {EVENT_KEY_PRESS, SDLK_UP, 1280, 720});
AddCtrlPress(SDLK_Q);
Wait(co);
// AddCtrlPress(SDLK_DOWN);
// AddCtrlPress(SDLK_DOWN);
// AddCtrlPress(SDLK_DOWN);
// Wait(co);
Int buffer_len = 0;
{
BSet main = GetActiveMainSet();
Assert(main.buffer->name == basic_env_cpp);
Assert(main.view->carets[0].range.min == range.min);
Assert(main.view->carets[0].range.max == range.max);
buffer_len = main.buffer->len;
}
// Range range = {};
// {
// BSet main = GetActiveMainSet();
// Assert(main.view->carets[0].range.min > 0);
// Assert(main.view->carets[0].range.max > 0);
// range = main.view->carets[0].range;
// }
AddText(Format(SysAllocator, "%S:20", basic_env_cpp));
AddCtrlPress(SDLK_Q);
Wait(co);
// AddCtrlPress(SDLK_P);
// Add(&EventPlayback, {EVENT_KEY_PRESS, SDLK_UP, 1280, 720});
// AddCtrlPress(SDLK_Q);
// Wait(co);
{
BSet main = GetActiveMainSet();
Int pos = main.view->carets[0].range.min;
Int line = PosToLine(main.buffer, pos);
Assert(line == 19);
Assert(main.buffer->name == basic_env_cpp);
Assert(main.buffer->len != buffer_len);
Assert(main.buffer->dirty);
}
// Int buffer_len = 0;
// {
// BSet main = GetActiveMainSet();
// Assert(main.buffer->name == basic_env_cpp);
// Assert(main.view->carets[0].range.min == range.min);
// Assert(main.view->carets[0].range.max == range.max);
// buffer_len = main.buffer->len;
// }
AddCtrlPress(SDLK_Z);
AddCtrlPress(SDLK_PAGEUP);
Wait(co);
// AddText(Format(SysAllocator, "%S:20", basic_env_cpp));
// AddCtrlPress(SDLK_Q);
// Wait(co);
{
BSet main = GetActiveMainSet();
Assert(main.buffer->len == buffer_len);
Assert(main.view->carets[0].range.min == 0);
Assert(main.view->carets[0].range.max == 0);
}
// {
// BSet main = GetActiveMainSet();
// Int pos = main.view->carets[0].range.min;
// Int line = PosToLine(main.buffer, pos);
// Assert(line == 19);
// Assert(main.buffer->name == basic_env_cpp);
// Assert(main.buffer->len != buffer_len);
// Assert(main.buffer->dirty);
// }
// AddCtrlPress(SDLK_Z);
// AddCtrlPress(SDLK_PAGEUP);
// Wait(co);
// {
// BSet main = GetActiveMainSet();
// Assert(main.buffer->len == buffer_len);
// Assert(main.view->carets[0].range.min == 0);
// Assert(main.view->carets[0].range.max == 0);
// }
ReportConsolef("%s DONE", __FUNCTION__);
}
void Test(mco_coro *co) {
WorkDir = Format(SysAllocator, "%S/basic_env", TestDir);
Wait(co); // First phase starts immediately but stuff is not initialized so Command_Open acts weird
Command_Open(TestDir);
PlayTestOpen(co);
Release(&TestArena);
// Add(&EventPlayback, {EVENT_QUIT});
@@ -108,11 +151,6 @@ void Test(mco_coro *co) {
void InitTests() {
StyleWaitForEvents = false;
{
String file = __FILE__;
file = NormalizePath(SysAllocator, file);
file = ChopLastSlash(file);
TestDir = file;
}
TestDir = Format(TestArena, "%S/test_env", GetExeDir(TestArena));
CoAdd(Test);
}

View File

@@ -1179,6 +1179,22 @@ API void DeinitBuffer(Buffer *buffer) {
DeallocHistoryArray(&buffer->redo_stack);
}
// Indexing starts from 0 not 1 because this routine creates also the zero buffer
// which is the buffer that often is defaulted to in case of errors
Int BufferIDs;
API Buffer *AllocBuffer(Allocator allocator, String name = "", Int size = 4096) {
Buffer *buffer = AllocType(allocator, Buffer);
buffer->id = {BufferIDs++, buffer};
buffer->name = Intern(&GlobalInternTable, name);
InitBuffer(allocator, buffer, buffer->id, buffer->name, size);
return buffer;
}
API void DeallocBuffer(Buffer *buffer) {
DeinitBuffer(buffer);
Dealloc(buffer->line_starts.allocator, buffer);
}
API Buffer *CreateTempBuffer(Allocator allocator, Int size = 4096) {
Buffer *result = AllocType(allocator, Buffer);
result->no_history = true;
@@ -1187,7 +1203,7 @@ API Buffer *CreateTempBuffer(Allocator allocator, Int size = 4096) {
return result;
}
void TestBuffer() {
void RunBufferTest() {
{
Scratch scratch;
Buffer buffer = {};

View File

@@ -222,7 +222,6 @@ void ReportWarningf(const char *fmt, ...) {
STRING_FORMAT(scratch, fmt, string);
View *null_view = GetView(NullViewID);
Command_Appendf(null_view, "%S\n", string);
ActiveWindow = NullWindowID;
}
void ReportDebugf(const char *fmt, ...) {

View File

@@ -19,27 +19,23 @@ EM_ASYNC_JS(const char *, GetClipboardText, (), {
#define _SetClipboardText SDL_SetClipboardText
#endif
void SetClipboardText(String16 string16) {
String string = ToString(SysAllocator, string16);
defer { Dealloc(SysAllocator, string.data); };
_SetClipboardText(string.data);
}
void FreeClipboardGlobals() {
For(SavedClipboardCarets) Dealloc(SysAllocator, it.data);
SavedClipboardCarets.len = 0;
Dealloc(SysAllocator, SavedClipboardString.data);
Release(&ClipboardArena);
SavedClipboardString = {};
SavedClipboardCarets = {};
SavedClipboardCarets.allocator = ClipboardArena;
}
void SaveStringInClipboard(String16 string) {
Scratch scratch;
FreeClipboardGlobals();
SavedClipboardString = Copy16(SysAllocator, string);
SetClipboardText(string);
SavedClipboardString = Copy16(ClipboardArena, string);
_SetClipboardText(ToString(scratch, SavedClipboardString).data);
}
void Command_Copy(View *view) {
Buffer *buffer = GetBuffer(view->active_buffer);
Scratch scratch;
Buffer *buffer = GetBuffer(view->active_buffer);
// First, if there is no selection - select the entire line
For(view->carets) {
@@ -51,16 +47,16 @@ void Command_Copy(View *view) {
}
FreeClipboardGlobals();
Reserve(&SavedClipboardCarets, view->carets.len);
For(view->carets) {
String16 string = GetString(buffer, it.range);
String16 copy = Copy16(SysAllocator, string);
String16 copy = Copy16(ClipboardArena, string);
Add(&SavedClipboardCarets, copy);
}
// @todo: maybe only add new line if there is no new line at the end, experiment with it
SavedClipboardString = Merge(SysAllocator, SavedClipboardCarets, u"\n");
SetClipboardText(SavedClipboardString);
SavedClipboardString = Merge(ClipboardArena, SavedClipboardCarets, u"\n");
_SetClipboardText(ToString(scratch, SavedClipboardString).data);
}
void Command_Paste(View *view) {
@@ -69,8 +65,7 @@ void Command_Paste(View *view) {
const char *text = GetClipboardText();
defer { FreeClipboardText((void *)text); };
String16 string = ToUnixString16(SysAllocator, text);
defer { Dealloc(SysAllocator, string.data); };
String16 string = ToUnixString16(scratch, text);
// Regular paste
if (string != SavedClipboardString || SavedClipboardCarets.len != view->carets.len) {

View File

@@ -1,29 +1,38 @@
using EventKind = uint32_t;
enum {
EVENT_NONE,
EVENT_UPDATE,
EVENT_QUIT,
#define EVENT_KINDS \
X(EVENT_NONE) \
X(EVENT_UPDATE) \
X(EVENT_QUIT) \
X(EVENT_MOUSE_LEFT) \
X(EVENT_MOUSE_RIGHT) \
X(EVENT_MOUSE_MIDDLE) \
X(EVENT_MOUSE_X1) \
X(EVENT_MOUSE_X2) \
X(EVENT_MOUSE_LEFT_UP) \
X(EVENT_MOUSE_RIGHT_UP) \
X(EVENT_MOUSE_MIDDLE_UP) \
X(EVENT_MOUSE_X1_UP) \
X(EVENT_MOUSE_X2_UP) \
X(EVENT_MOUSE_WHEEL) \
X(EVENT_KEY_PRESS) \
X(EVENT_TEXT_INPUT) \
X(EVENT_DROP_FILE)
EVENT_MOUSE_LEFT,
EVENT_MOUSE_RIGHT,
EVENT_MOUSE_MIDDLE,
EVENT_MOUSE_X1,
EVENT_MOUSE_X2,
EVENT_MOUSE_LEFT_UP,
EVENT_MOUSE_RIGHT_UP,
EVENT_MOUSE_MIDDLE_UP,
EVENT_MOUSE_X1_UP,
EVENT_MOUSE_X2_UP,
EVENT_MOUSE_WHEEL,
enum EventKind {
#define X(TYPE) TYPE,
EVENT_KINDS
#undef X
EVENT_KIND_COUNT,
EVENT_KIND_INVALID = 111,
};
EVENT_KEY_PRESS,
EVENT_TEXT_INPUT,
EVENT_DROP_FILE,
const char *EventKindStrings[] = {
#define X(TYPE) #TYPE,
EVENT_KINDS
#undef X
};
#define EVENT_FIELDS \
X(EventKind, Int, kind) \
X(EventKind, Int, kind) \
X(SDL_Keycode, Int, key) \
X(int16_t, Int, xwindow) \
X(int16_t, Int, ywindow) \
@@ -46,6 +55,328 @@ struct Event {
};
Array<Event> EventPlayback;
const char *SDLKeycodeToName(SDL_Keycode keycode) {
switch(keycode) {
case SDLK_UNKNOWN: return "SDLK_UNKNOWN"; break;
case SDLK_RETURN: return "SDLK_RETURN"; break;
case SDLK_ESCAPE: return "SDLK_ESCAPE"; break;
case SDLK_BACKSPACE: return "SDLK_BACKSPACE"; break;
case SDLK_TAB: return "SDLK_TAB"; break;
case SDLK_SPACE: return "SDLK_SPACE"; break;
case SDLK_EXCLAIM: return "SDLK_EXCLAIM"; break;
case SDLK_DBLAPOSTROPHE: return "SDLK_DBLAPOSTROPHE"; break;
case SDLK_HASH: return "SDLK_HASH"; break;
case SDLK_DOLLAR: return "SDLK_DOLLAR"; break;
case SDLK_PERCENT: return "SDLK_PERCENT"; break;
case SDLK_AMPERSAND: return "SDLK_AMPERSAND"; break;
case SDLK_APOSTROPHE: return "SDLK_APOSTROPHE"; break;
case SDLK_LEFTPAREN: return "SDLK_LEFTPAREN"; break;
case SDLK_RIGHTPAREN: return "SDLK_RIGHTPAREN"; break;
case SDLK_ASTERISK: return "SDLK_ASTERISK"; break;
case SDLK_PLUS: return "SDLK_PLUS"; break;
case SDLK_COMMA: return "SDLK_COMMA"; break;
case SDLK_MINUS: return "SDLK_MINUS"; break;
case SDLK_PERIOD: return "SDLK_PERIOD"; break;
case SDLK_SLASH: return "SDLK_SLASH"; break;
case SDLK_0: return "SDLK_0"; break;
case SDLK_1: return "SDLK_1"; break;
case SDLK_2: return "SDLK_2"; break;
case SDLK_3: return "SDLK_3"; break;
case SDLK_4: return "SDLK_4"; break;
case SDLK_5: return "SDLK_5"; break;
case SDLK_6: return "SDLK_6"; break;
case SDLK_7: return "SDLK_7"; break;
case SDLK_8: return "SDLK_8"; break;
case SDLK_9: return "SDLK_9"; break;
case SDLK_COLON: return "SDLK_COLON"; break;
case SDLK_SEMICOLON: return "SDLK_SEMICOLON"; break;
case SDLK_LESS: return "SDLK_LESS"; break;
case SDLK_EQUALS: return "SDLK_EQUALS"; break;
case SDLK_GREATER: return "SDLK_GREATER"; break;
case SDLK_QUESTION: return "SDLK_QUESTION"; break;
case SDLK_AT: return "SDLK_AT"; break;
case SDLK_LEFTBRACKET: return "SDLK_LEFTBRACKET"; break;
case SDLK_BACKSLASH: return "SDLK_BACKSLASH"; break;
case SDLK_RIGHTBRACKET: return "SDLK_RIGHTBRACKET"; break;
case SDLK_CARET: return "SDLK_CARET"; break;
case SDLK_UNDERSCORE: return "SDLK_UNDERSCORE"; break;
case SDLK_GRAVE: return "SDLK_GRAVE"; break;
case SDLK_A: return "SDLK_A"; break;
case SDLK_B: return "SDLK_B"; break;
case SDLK_C: return "SDLK_C"; break;
case SDLK_D: return "SDLK_D"; break;
case SDLK_E: return "SDLK_E"; break;
case SDLK_F: return "SDLK_F"; break;
case SDLK_G: return "SDLK_G"; break;
case SDLK_H: return "SDLK_H"; break;
case SDLK_I: return "SDLK_I"; break;
case SDLK_J: return "SDLK_J"; break;
case SDLK_K: return "SDLK_K"; break;
case SDLK_L: return "SDLK_L"; break;
case SDLK_M: return "SDLK_M"; break;
case SDLK_N: return "SDLK_N"; break;
case SDLK_O: return "SDLK_O"; break;
case SDLK_P: return "SDLK_P"; break;
case SDLK_Q: return "SDLK_Q"; break;
case SDLK_R: return "SDLK_R"; break;
case SDLK_S: return "SDLK_S"; break;
case SDLK_T: return "SDLK_T"; break;
case SDLK_U: return "SDLK_U"; break;
case SDLK_V: return "SDLK_V"; break;
case SDLK_W: return "SDLK_W"; break;
case SDLK_X: return "SDLK_X"; break;
case SDLK_Y: return "SDLK_Y"; break;
case SDLK_Z: return "SDLK_Z"; break;
case SDLK_LEFTBRACE: return "SDLK_LEFTBRACE"; break;
case SDLK_PIPE: return "SDLK_PIPE"; break;
case SDLK_RIGHTBRACE: return "SDLK_RIGHTBRACE"; break;
case SDLK_TILDE: return "SDLK_TILDE"; break;
case SDLK_DELETE: return "SDLK_DELETE"; break;
case SDLK_PLUSMINUS: return "SDLK_PLUSMINUS"; break;
case SDLK_CAPSLOCK: return "SDLK_CAPSLOCK"; break;
case SDLK_F1: return "SDLK_F1"; break;
case SDLK_F2: return "SDLK_F2"; break;
case SDLK_F3: return "SDLK_F3"; break;
case SDLK_F4: return "SDLK_F4"; break;
case SDLK_F5: return "SDLK_F5"; break;
case SDLK_F6: return "SDLK_F6"; break;
case SDLK_F7: return "SDLK_F7"; break;
case SDLK_F8: return "SDLK_F8"; break;
case SDLK_F9: return "SDLK_F9"; break;
case SDLK_F10: return "SDLK_F10"; break;
case SDLK_F11: return "SDLK_F11"; break;
case SDLK_F12: return "SDLK_F12"; break;
case SDLK_PRINTSCREEN: return "SDLK_PRINTSCREEN"; break;
case SDLK_SCROLLLOCK: return "SDLK_SCROLLLOCK"; break;
case SDLK_PAUSE: return "SDLK_PAUSE"; break;
case SDLK_INSERT: return "SDLK_INSERT"; break;
case SDLK_HOME: return "SDLK_HOME"; break;
case SDLK_PAGEUP: return "SDLK_PAGEUP"; break;
case SDLK_END: return "SDLK_END"; break;
case SDLK_PAGEDOWN: return "SDLK_PAGEDOWN"; break;
case SDLK_RIGHT: return "SDLK_RIGHT"; break;
case SDLK_LEFT: return "SDLK_LEFT"; break;
case SDLK_DOWN: return "SDLK_DOWN"; break;
case SDLK_UP: return "SDLK_UP"; break;
case SDLK_NUMLOCKCLEAR: return "SDLK_NUMLOCKCLEAR"; break;
case SDLK_KP_DIVIDE: return "SDLK_KP_DIVIDE"; break;
case SDLK_KP_MULTIPLY: return "SDLK_KP_MULTIPLY"; break;
case SDLK_KP_MINUS: return "SDLK_KP_MINUS"; break;
case SDLK_KP_PLUS: return "SDLK_KP_PLUS"; break;
case SDLK_KP_ENTER: return "SDLK_KP_ENTER"; break;
case SDLK_KP_1: return "SDLK_KP_1"; break;
case SDLK_KP_2: return "SDLK_KP_2"; break;
case SDLK_KP_3: return "SDLK_KP_3"; break;
case SDLK_KP_4: return "SDLK_KP_4"; break;
case SDLK_KP_5: return "SDLK_KP_5"; break;
case SDLK_KP_6: return "SDLK_KP_6"; break;
case SDLK_KP_7: return "SDLK_KP_7"; break;
case SDLK_KP_8: return "SDLK_KP_8"; break;
case SDLK_KP_9: return "SDLK_KP_9"; break;
case SDLK_KP_0: return "SDLK_KP_0"; break;
case SDLK_KP_PERIOD: return "SDLK_KP_PERIOD"; break;
case SDLK_APPLICATION: return "SDLK_APPLICATION"; break;
case SDLK_POWER: return "SDLK_POWER"; break;
case SDLK_KP_EQUALS: return "SDLK_KP_EQUALS"; break;
case SDLK_F13: return "SDLK_F13"; break;
case SDLK_F14: return "SDLK_F14"; break;
case SDLK_F15: return "SDLK_F15"; break;
case SDLK_F16: return "SDLK_F16"; break;
case SDLK_F17: return "SDLK_F17"; break;
case SDLK_F18: return "SDLK_F18"; break;
case SDLK_F19: return "SDLK_F19"; break;
case SDLK_F20: return "SDLK_F20"; break;
case SDLK_F21: return "SDLK_F21"; break;
case SDLK_F22: return "SDLK_F22"; break;
case SDLK_F23: return "SDLK_F23"; break;
case SDLK_F24: return "SDLK_F24"; break;
case SDLK_EXECUTE: return "SDLK_EXECUTE"; break;
case SDLK_HELP: return "SDLK_HELP"; break;
case SDLK_MENU: return "SDLK_MENU"; break;
case SDLK_SELECT: return "SDLK_SELECT"; break;
case SDLK_STOP: return "SDLK_STOP"; break;
case SDLK_AGAIN: return "SDLK_AGAIN"; break;
case SDLK_UNDO: return "SDLK_UNDO"; break;
case SDLK_CUT: return "SDLK_CUT"; break;
case SDLK_COPY: return "SDLK_COPY"; break;
case SDLK_PASTE: return "SDLK_PASTE"; break;
case SDLK_FIND: return "SDLK_FIND"; break;
case SDLK_MUTE: return "SDLK_MUTE"; break;
case SDLK_VOLUMEUP: return "SDLK_VOLUMEUP"; break;
case SDLK_VOLUMEDOWN: return "SDLK_VOLUMEDOWN"; break;
case SDLK_KP_COMMA: return "SDLK_KP_COMMA"; break;
case SDLK_KP_EQUALSAS400: return "SDLK_KP_EQUALSAS400"; break;
case SDLK_ALTERASE: return "SDLK_ALTERASE"; break;
case SDLK_SYSREQ: return "SDLK_SYSREQ"; break;
case SDLK_CANCEL: return "SDLK_CANCEL"; break;
case SDLK_CLEAR: return "SDLK_CLEAR"; break;
case SDLK_PRIOR: return "SDLK_PRIOR"; break;
case SDLK_RETURN2: return "SDLK_RETURN2"; break;
case SDLK_SEPARATOR: return "SDLK_SEPARATOR"; break;
case SDLK_OUT: return "SDLK_OUT"; break;
case SDLK_OPER: return "SDLK_OPER"; break;
case SDLK_CLEARAGAIN: return "SDLK_CLEARAGAIN"; break;
case SDLK_CRSEL: return "SDLK_CRSEL"; break;
case SDLK_EXSEL: return "SDLK_EXSEL"; break;
case SDLK_KP_00: return "SDLK_KP_00"; break;
case SDLK_KP_000: return "SDLK_KP_000"; break;
case SDLK_THOUSANDSSEPARATOR: return "SDLK_THOUSANDSSEPARATOR"; break;
case SDLK_DECIMALSEPARATOR: return "SDLK_DECIMALSEPARATOR"; break;
case SDLK_CURRENCYUNIT: return "SDLK_CURRENCYUNIT"; break;
case SDLK_CURRENCYSUBUNIT: return "SDLK_CURRENCYSUBUNIT"; break;
case SDLK_KP_LEFTPAREN: return "SDLK_KP_LEFTPAREN"; break;
case SDLK_KP_RIGHTPAREN: return "SDLK_KP_RIGHTPAREN"; break;
case SDLK_KP_LEFTBRACE: return "SDLK_KP_LEFTBRACE"; break;
case SDLK_KP_RIGHTBRACE: return "SDLK_KP_RIGHTBRACE"; break;
case SDLK_KP_TAB: return "SDLK_KP_TAB"; break;
case SDLK_KP_BACKSPACE: return "SDLK_KP_BACKSPACE"; break;
case SDLK_KP_A: return "SDLK_KP_A"; break;
case SDLK_KP_B: return "SDLK_KP_B"; break;
case SDLK_KP_C: return "SDLK_KP_C"; break;
case SDLK_KP_D: return "SDLK_KP_D"; break;
case SDLK_KP_E: return "SDLK_KP_E"; break;
case SDLK_KP_F: return "SDLK_KP_F"; break;
case SDLK_KP_XOR: return "SDLK_KP_XOR"; break;
case SDLK_KP_POWER: return "SDLK_KP_POWER"; break;
case SDLK_KP_PERCENT: return "SDLK_KP_PERCENT"; break;
case SDLK_KP_LESS: return "SDLK_KP_LESS"; break;
case SDLK_KP_GREATER: return "SDLK_KP_GREATER"; break;
case SDLK_KP_AMPERSAND: return "SDLK_KP_AMPERSAND"; break;
case SDLK_KP_DBLAMPERSAND: return "SDLK_KP_DBLAMPERSAND"; break;
case SDLK_KP_VERTICALBAR: return "SDLK_KP_VERTICALBAR"; break;
case SDLK_KP_DBLVERTICALBAR: return "SDLK_KP_DBLVERTICALBAR"; break;
case SDLK_KP_COLON: return "SDLK_KP_COLON"; break;
case SDLK_KP_HASH: return "SDLK_KP_HASH"; break;
case SDLK_KP_SPACE: return "SDLK_KP_SPACE"; break;
case SDLK_KP_AT: return "SDLK_KP_AT"; break;
case SDLK_KP_EXCLAM: return "SDLK_KP_EXCLAM"; break;
case SDLK_KP_MEMSTORE: return "SDLK_KP_MEMSTORE"; break;
case SDLK_KP_MEMRECALL: return "SDLK_KP_MEMRECALL"; break;
case SDLK_KP_MEMCLEAR: return "SDLK_KP_MEMCLEAR"; break;
case SDLK_KP_MEMADD: return "SDLK_KP_MEMADD"; break;
case SDLK_KP_MEMSUBTRACT: return "SDLK_KP_MEMSUBTRACT"; break;
case SDLK_KP_MEMMULTIPLY: return "SDLK_KP_MEMMULTIPLY"; break;
case SDLK_KP_MEMDIVIDE: return "SDLK_KP_MEMDIVIDE"; break;
case SDLK_KP_PLUSMINUS: return "SDLK_KP_PLUSMINUS"; break;
case SDLK_KP_CLEAR: return "SDLK_KP_CLEAR"; break;
case SDLK_KP_CLEARENTRY: return "SDLK_KP_CLEARENTRY"; break;
case SDLK_KP_BINARY: return "SDLK_KP_BINARY"; break;
case SDLK_KP_OCTAL: return "SDLK_KP_OCTAL"; break;
case SDLK_KP_DECIMAL: return "SDLK_KP_DECIMAL"; break;
case SDLK_KP_HEXADECIMAL: return "SDLK_KP_HEXADECIMAL"; break;
case SDLK_LCTRL: return "SDLK_LCTRL"; break;
case SDLK_LSHIFT: return "SDLK_LSHIFT"; break;
case SDLK_LALT: return "SDLK_LALT"; break;
case SDLK_LGUI: return "SDLK_LGUI"; break;
case SDLK_RCTRL: return "SDLK_RCTRL"; break;
case SDLK_RSHIFT: return "SDLK_RSHIFT"; break;
case SDLK_RALT: return "SDLK_RALT"; break;
case SDLK_RGUI: return "SDLK_RGUI"; break;
case SDLK_MODE: return "SDLK_MODE"; break;
case SDLK_SLEEP: return "SDLK_SLEEP"; break;
case SDLK_WAKE: return "SDLK_WAKE"; break;
case SDLK_CHANNEL_INCREMENT: return "SDLK_CHANNEL_INCREMENT"; break;
case SDLK_CHANNEL_DECREMENT: return "SDLK_CHANNEL_DECREMENT"; break;
case SDLK_MEDIA_PLAY: return "SDLK_MEDIA_PLAY"; break;
case SDLK_MEDIA_PAUSE: return "SDLK_MEDIA_PAUSE"; break;
case SDLK_MEDIA_RECORD: return "SDLK_MEDIA_RECORD"; break;
case SDLK_MEDIA_FAST_FORWARD: return "SDLK_MEDIA_FAST_FORWARD"; break;
case SDLK_MEDIA_REWIND: return "SDLK_MEDIA_REWIND"; break;
case SDLK_MEDIA_NEXT_TRACK: return "SDLK_MEDIA_NEXT_TRACK"; break;
case SDLK_MEDIA_PREVIOUS_TRACK: return "SDLK_MEDIA_PREVIOUS_TRACK"; break;
case SDLK_MEDIA_STOP: return "SDLK_MEDIA_STOP"; break;
case SDLK_MEDIA_EJECT: return "SDLK_MEDIA_EJECT"; break;
case SDLK_MEDIA_PLAY_PAUSE: return "SDLK_MEDIA_PLAY_PAUSE"; break;
case SDLK_MEDIA_SELECT: return "SDLK_MEDIA_SELECT"; break;
case SDLK_AC_NEW: return "SDLK_AC_NEW"; break;
case SDLK_AC_OPEN: return "SDLK_AC_OPEN"; break;
case SDLK_AC_CLOSE: return "SDLK_AC_CLOSE"; break;
case SDLK_AC_EXIT: return "SDLK_AC_EXIT"; break;
case SDLK_AC_SAVE: return "SDLK_AC_SAVE"; break;
case SDLK_AC_PRINT: return "SDLK_AC_PRINT"; break;
case SDLK_AC_PROPERTIES: return "SDLK_AC_PROPERTIES"; break;
case SDLK_AC_SEARCH: return "SDLK_AC_SEARCH"; break;
case SDLK_AC_HOME: return "SDLK_AC_HOME"; break;
case SDLK_AC_BACK: return "SDLK_AC_BACK"; break;
case SDLK_AC_FORWARD: return "SDLK_AC_FORWARD"; break;
case SDLK_AC_STOP: return "SDLK_AC_STOP"; break;
case SDLK_AC_REFRESH: return "SDLK_AC_REFRESH"; break;
case SDLK_AC_BOOKMARKS: return "SDLK_AC_BOOKMARKS"; break;
case SDLK_SOFTLEFT: return "SDLK_SOFTLEFT"; break;
case SDLK_SOFTRIGHT: return "SDLK_SOFTRIGHT"; break;
case SDLK_CALL: return "SDLK_CALL"; break;
case SDLK_ENDCALL: return "SDLK_ENDCALL"; break;
case SDLK_LEFT_TAB: return "SDLK_LEFT_TAB"; break;
case SDLK_LEVEL5_SHIFT: return "SDLK_LEVEL5_SHIFT"; break;
case SDLK_MULTI_KEY_COMPOSE: return "SDLK_MULTI_KEY_COMPOSE"; break;
case SDLK_LMETA: return "SDLK_LMETA"; break;
case SDLK_RMETA: return "SDLK_RMETA"; break;
case SDLK_LHYPER: return "SDLK_LHYPER"; break;
case SDLK_RHYPER: return "SDLK_RHYPER"; break;
default: return "SDLK_INVALID";
}
}
struct Serializer {
Buffer *buffer; // for writing
};
void Serialize(Serializer *s, String name, EventKind *kind) {
RawAppendf(s->buffer, "ev.%S = %s; ", name, EventKindStrings[*kind]);
}
void Serialize(Serializer *s, String name, Int *datum) {
if (*datum == 0) {
return;
}
if (name == "key") {
RawAppendf(s->buffer, "ev.%S = %s; ", name, SDLKeycodeToName((SDL_Keycode)*datum));
} else {
RawAppendf(s->buffer, "ev.%S = %lld; ", name, (long long)*datum);
}
}
void Serialize(Serializer *s, String name, uint32_t *datum) {
Int d = *datum;
Serialize(s, name, &d);
*datum = (uint32_t)d;
}
void Serialize(Serializer *s, String name, uint8_t *datum) {
Int d = *datum;
Serialize(s, name, &d);
*datum = (uint8_t)d;
}
void Serialize(Serializer *s, String name, int16_t *datum) {
Int d = *datum;
Serialize(s, name, &d);
*datum = (int16_t)d;
}
void Serialize(Serializer *s, String name, float *datum) {
if (*datum == 0.f) {
return;
}
RawAppendf(s->buffer, "ev.%S = %f; ", name, *datum);
}
void Serialize(Serializer *s, String name, char **text) {
String str = *text;
if (str.len == 0) {
return;
}
RawAppendf(s->buffer, "ev.%S = \"%S\"; ", name, str);
}
void SerializeBegin(Serializer *s) {
RawAppendf(s->buffer, "{Event ev = {};");
}
void SerializeEnd(Serializer *s) {
RawAppendf(s->buffer, "Add(&EventPlayback, ev);}\n");
}
// :Event
void Serialize(Serializer *s, Event *e) {
SerializeBegin(s);

View File

@@ -1,5 +1,4 @@
WindowID WindowIDs;
BufferID BufferIDs;
ViewID ViewIDs;
Window *FirstWindow;
@@ -50,6 +49,7 @@ String16 LuaCommandResult = {};
extern luaL_Reg LuaFunctions[];
// clipboard
BlockArena ClipboardArena;
String16 SavedClipboardString;
Array<String16> SavedClipboardCarets = {SysAllocator};
@@ -69,7 +69,7 @@ String GetUniqueBufferName(String working_dir, String prepend_name, String exten
return buffer_name;
}
void InitScratchBuffer() {
void InitBuffers() {
Allocator sys_allocator = GetSystemAllocator();
Scratch scratch;
Buffer *null_buffer = CreateBuffer(sys_allocator, GetUniqueBufferName(GetWorkingDir(scratch), "console"));
@@ -98,7 +98,7 @@ inline bool IsScrollbarSelectionValid() {
inline ViewID AllocViewID(View *view) { return {ViewIDs.id++, view}; }
inline WindowID AllocWindowID(Window *window) { return {WindowIDs.id++, window}; }
inline BufferID AllocBufferID(Buffer *buffer) { return {BufferIDs.id++, buffer}; }
inline BufferID AllocBufferID(Buffer *buffer) { return {BufferIDs++, buffer}; }
inline Window *GetWindow(WindowID id) {
for (Window *it = FirstWindow; it; it = it->next) {
@@ -145,28 +145,8 @@ inline View *GetView(ViewID id) {
inline bool IsNull(Buffer *buffer) { return buffer->id.id == NullBufferID.id; }
inline Window *GetActiveWind() { return GetWindow(ActiveWindow); }
void InitBuffer(Allocator allocator, Buffer *buffer, String name, Int size = 4096) {
buffer->id = AllocBufferID(buffer);
buffer->name = Intern(&GlobalInternTable, name);
buffer->cap = size;
buffer->data = AllocArray(allocator, U16, buffer->cap);
buffer->line_starts.allocator = allocator;
buffer->undo_stack.allocator = allocator;
buffer->redo_stack.allocator = allocator;
if (!buffer->no_line_starts) Add(&buffer->line_starts, (Int)0);
}
void DeallocBuffer(Buffer *buffer) {
Dealloc(&buffer->line_starts);
DeallocHistoryArray(&buffer->undo_stack);
DeallocHistoryArray(&buffer->redo_stack);
Dealloc(buffer->line_starts.allocator, buffer->data);
Dealloc(buffer->line_starts.allocator, buffer);
}
Buffer *CreateBuffer(Allocator allocator, String name, Int size) {
Buffer *result = AllocType(allocator, Buffer);
InitBuffer(allocator, result, name, size);
Buffer *result = AllocBuffer(allocator, name, size);
DLL_QUEUE_ADD(FirstBuffer, LastBuffer, result);
BufferCount += 1;
return result;
@@ -434,13 +414,6 @@ Buffer *BufferOpenFile(String path) {
return buffer;
}
void ResetBuffer(Buffer *buffer) {
Assert(buffer->edit_phase == 0);
buffer->line_starts.len = 1;
DeallocHistoryEntries(&buffer->redo_stack);
DeallocHistoryEntries(&buffer->undo_stack);
}
View *OpenBufferView(String name) {
Buffer *buffer = BufferOpenFile(name);
View *view = CreateView(buffer->id);
@@ -532,9 +505,9 @@ void GarbageCollect() {
continue;
}
DLL_QUEUE_REMOVE(FirstView, LastView, it);
Dealloc(&it->carets);
Dealloc(sys_allocator, it);
DLL_QUEUE_REMOVE(FirstView, LastView, it);
}
for (Buffer *it = FirstBuffer, *next = NULL; it; it = next) {
@@ -549,8 +522,8 @@ void GarbageCollect() {
continue;
}
DeallocBuffer(it);
DLL_QUEUE_REMOVE(FirstBuffer, LastBuffer, it);
DeallocBuffer(it);
}
// for (Window *it = FirstWindow, *next = NULL; it; it = next) {

View File

@@ -1,42 +0,0 @@
struct Serializer {
Buffer *buffer; // for writing
};
void Serialize(Serializer *s, String name, Int *datum) {
RawAppendf(s->buffer, "%S = %lld, ", name, (long long)*datum);
}
void Serialize(Serializer *s, String name, uint32_t *datum) {
Int d = *datum;
Serialize(s, name, &d);
*datum = (uint32_t)d;
}
void Serialize(Serializer *s, String name, uint8_t *datum) {
Int d = *datum;
Serialize(s, name, &d);
*datum = (uint8_t)d;
}
void Serialize(Serializer *s, String name, int16_t *datum) {
Int d = *datum;
Serialize(s, name, &d);
*datum = (int16_t)d;
}
void Serialize(Serializer *s, String name, float *datum) {
RawAppendf(s->buffer, "%S = %f, ", name, *datum);
}
void Serialize(Serializer *s, String name, char **text) {
String str = *text;
RawAppendf(s->buffer, "%S = \"%S\", ", name, str);
}
void SerializeBegin(Serializer *s) {
RawAppendf(s->buffer, "{");
}
void SerializeEnd(Serializer *s) {
RawAppendf(s->buffer, "},\n");
}

View File

@@ -16,6 +16,7 @@ SDL_Window *SDLWindow;
bool IsInFullscreen;
int FullScreenSizeX, FullScreenSizeY;
int FullScreenPositionX, FullScreenPositionY;
bool Testing = true;
#include "generated_variables.cpp"
#include "render/generated_font.cpp"
@@ -24,13 +25,12 @@ int FullScreenPositionX, FullScreenPositionY;
#include "buffer.h"
#include "text_editor.h"
#include "intern_table.cpp"
#include "buffer.cpp"
#include "intern_table.cpp"
#include "management.cpp"
#include "window.cpp"
#include "process.cpp"
#include "serializer.cpp"
#include "event.cpp"
#include "lua_api.cpp"
@@ -328,8 +328,11 @@ void MainLoop() {
Scratch scratch;
Array<Event> frame_events = GetEventsForFrame(scratch);
Serializer ser = {EventBuffer};
For(frame_events) {
// Serialize(&ser, &it);
if (it.kind != 1) {
if (!Testing) Serialize(&ser, &it);
}
if (it.kind == EVENT_QUIT) {
AppIsRunning = false;
return;
@@ -392,8 +395,8 @@ int main(int argc, char **argv)
BeginProfiler();
if (1) {
TestArena();
TestBuffer();
RunArenaTest();
RunBufferTest();
// ReportErrorf("Testing DONE\n");
// return 0;
}
@@ -484,20 +487,19 @@ int main(int argc, char **argv)
if (scale != 1.0f) DPIScale = scale;
}
InitScratchBuffer();
InitBuffers();
InitRender();
ReloadFont();
InitWindows();
InitOS(ReportWarningf);
bool testing = false;
for (int i = 1; i < argc; i += 1) {
String it = argv[i];
if (!FileExists(it)) continue;
if (it == "--testing") {
testing = true;
Testing = true;
} else if (EndsWith(it, ".project.lua")) {
SetProjectFile(BufferOpenFile(it));
} else {
@@ -508,7 +510,7 @@ int main(int argc, char **argv)
ReportConsolef("WorkDir = %S", WorkDir);
InitLuaConfig();
if (testing) InitTests();
if (Testing) InitTests();
#if OS_WINDOWS
CoAdd(Windows_SetupVCVarsall);
#endif