#define PRINTF(...) do { if (n == g_NodeDrawSelected) vt100EnableNegative(); printf(__VA_ARGS__); vt100DisableNegative(); } while(0);
switch (n->kind) {
- case NK_Namespace: { PRINTF("namespace"); printf(" %s {", n->data); indent++; for (int i = 0; i < n->childCount; i++) { INDENT NodeDraw(NodeGetChild(n, i)); } indent--; INDENT printf("}\n"); break; }
- case NK_Struct: { PRINTF("struct"); printf(" %s {", n->data); indent++; for (int i = 0; i < n->childCount; i++) { INDENT NodeDraw(NodeGetChild(n, i)); } indent--; INDENT printf("}\n"); break; }
- case NK_Func: { PRINTF("fn"); printf(" %s ", n->data); NodeDraw(NodeGetChild(n, 0)); INDENT NodeDraw(NodeGetChild(n, 1)); break; }
+ case NK_Namespace: { PRINTF("namespace"); printf(" %s {", n->data); indent++; for (int i = 0; i < n->childCount; i++) { INDENT NodeDraw(NodeGetChild(n, i)); } indent--; INDENT printf("}"); break; }
+ case NK_Struct: { PRINTF("struct"); printf(" %s {", n->data); indent++; for (int i = 0; i < n->childCount; i++) { INDENT NodeDraw(NodeGetChild(n, i)); } indent--; INDENT printf("}"); break; }
+ case NK_Func: { PRINTF("fn"); printf(" %s ", n->data); NodeDraw(NodeGetChild(n, 0)); NodeDraw(NodeGetChild(n, 1)); break; }
case NK_VarList:
case NK_ExprList: { PRINTF("("); for (int i = 0; i < n->childCount; i++) { if (i != 0) printf(", "); NodeDraw(NodeGetChild(n, i)); } PRINTF(")"); break; }
case NK_Var: { PRINTF("[%s]", n->data); break; }
case NK_VarDecl: { PRINTF("[%s : ", n->data); NodeDraw(NodeGetChild(n, 0)); printf("]"); break; }
case NK_VarType:
case NK_Type: { PRINTF("%s", n->data); for (int i = 0; i < n->childCount; i++) { printf("%s", i == 0 ? "<" : ", "); NodeDraw(NodeGetChild(n, i)); if (i == n->childCount-1) printf(">"); } break; }
- case NK_Body: { PRINTF("{"); indent++; for (int i = 0; i < n->childCount; i++) { INDENT NodeDraw(NodeGetChild(n, i)); } indent--; INDENT PRINTF("}\n"); break; }
+ case NK_Body: { PRINTF("{"); indent++; for (int i = 0; i < n->childCount; i++) { INDENT NodeDraw(NodeGetChild(n, i)); } indent--; INDENT PRINTF("}"); break; }
case NK_If: { PRINTF("if"); printf(" "); NodeDraw(NodeGetChild(n, 0)); INDENT NodeDraw(NodeGetChild(n, 1)); break; }
case NK_While: { PRINTF("while"); printf(" "); NodeDraw(NodeGetChild(n, 0)); INDENT NodeDraw(NodeGetChild(n, 1)); break; }
case NK_Num: { PRINTF("%s", n->data); break; }
typedef enum Input {
IN_None,
- IN_SPACE,
- IN_D,
- IN_A,
-
IN_H,
IN_J,
IN_K,
IN_L,
+ IN_SPACE,
+ IN_D,
+ IN_A,
+
IN_F,
IN_V,
IN_T,
const char *IN_STRINGS[IN_COUNT] = {
"IN_None",
- "IN_SPACE",
- "IN_D",
- "IN_A",
-
"IN_H",
"IN_J",
"IN_K",
"IN_L",
+ "IN_SPACE",
+ "IN_D",
+ "IN_A",
+
"IN_F",
"IN_V",
"IN_T",
while (true) {
c = getch();
switch (c) {
- case ' ': return IN_SPACE;
- case 'd': return IN_D;
-
case 'h': return IN_H;
case 'j': return IN_J;
case 'k': return IN_K;
case 'l': return IN_L;
+ case ' ': return IN_SPACE;
+ case 'd': return IN_D;
+
case 'f': return IN_F;
case 'v': return IN_V;
case 't': return IN_T;
typedef enum InputAction {
IA_None,
- IA_StartEditing,
- IA_Delete,
-
IA_MoveLeft,
IA_MoveUp,
IA_MoveDown,
IA_MoveRight,
+ IA_StartEditing,
+ IA_Delete,
+
IA_AddNamespace,
IA_AddStruct,
IA_AddFunc,
const char *IA_STRINGS[IA_COUNT] = {
"IA_None",
- "IA_StartEditing",
- "IA_Delete",
-
"IA_MoveLeft",
"IA_MoveUp",
"IA_MoveDown",
"IA_MoveRight",
+ "IA_StartEditing",
+ "IA_Delete",
+
"IA_AddNamespace",
"IA_AddStruct",
"IA_AddFunc",
vt100CursorPos(line++, h-30);
printf("%s:%s", NK_STRINGS[nk], (mode == IM_Normal ? "" : " (editing)"));
- for (int i = 0; i < IN_COUNT; i++) {
+ for (int i = IN_L+1; i < IN_COUNT; i++) {
InputAction action = actions[nk][i];
if (action != IA_None) {
vt100CursorPos(line++, h-30);
#define S(NAME, PARENT, KIND) Node *NAME = NEW(Node); NAME->kind = KIND; NAME->data = NEWSTR; NodeAppend(PARENT, NAME);
switch (action) {
- case IA_StartEditing: { mode = IM_Editing; break; }
- case IA_Delete: { n = NodeRemove(n->parent, n); break; }
-
case IA_MoveLeft: { if (n->prev != NULL) n = n->prev; break; }
case IA_MoveDown: { if (n->child != NULL) n = n->child; break; }
case IA_MoveUp: { if (n->parent != NULL) n = n->parent; break; }
case IA_MoveRight: { if (n->next != NULL) n = n->next; break; }
+ case IA_StartEditing: { mode = IM_Editing; break; }
+ case IA_Delete: { n = NodeRemove(n->parent, n); break; }
+
case IA_AddNamespace: { S(n1, n, NK_Namespace) n = n1; mode = IM_Editing; break; }
case IA_AddStruct: { S(n1, n, NK_Struct) n = n1; mode = IM_Editing; break; }
case IA_AddFunc: { S(n1, n, NK_Func) N(n2, n1, NK_VarList) N(n3, n1, NK_Body) n = n1; mode = IM_Editing; break; }
}
-int main() {
- // Setup
- static InputAction actions[NK_COUNT][IN_COUNT];
-
+void SetupInputActions(InputAction actions[NK_COUNT][IN_COUNT]) {
for (int i = 0; i < NK_COUNT; i++) {
actions[i][IN_H] = IA_MoveLeft;
actions[i][IN_J] = IA_MoveUp;
actions[NK_Op][IN_S] = IA_AddStr;
actions[NK_Op][IN_C] = IA_AddCall;
actions[NK_Op][IN_O] = IA_AddOp;
+}
+
+int main() {
+ // Setup
+ static InputAction actions[NK_COUNT][IN_COUNT];
+ SetupInputActions(actions);
// Main
vt100EnableAlternateBuffer();
vt100DisableAlternateBuffer();
vt100ShowCursor();
- int v, h;
- vt100GetScreenSize(&v, &h);
- printf("Screen Size: %d | %d\n", v, h);
-
NodeDraw(n);
return 0;