diff --git a/Toy b/Toy index 5686677..8b04939 160000 --- a/Toy +++ b/Toy @@ -1 +1 @@ -Subproject commit 56866773838aa28f21bb26f9988d929954f985b8 +Subproject commit 8b049394308f153064d3e6dd735746e517255900 diff --git a/core/engine.c b/core/engine.c index 4b8ff8c..3f6e9bf 100644 --- a/core/engine.c +++ b/core/engine.c @@ -2,6 +2,7 @@ #include "lib_engine.h" #include "lib_standard.h" +#include "repl_tools.h" #include "memory.h" #include "lexer.h" @@ -24,79 +25,6 @@ static void fatalError(char* message) { exit(-1); } -//compilation functions -//TODO: move these to their own file -static char* readFile(char* path, size_t* fileSize) { - FILE* file = fopen(path, "rb"); - - if (file == NULL) { - fprintf(stderr, ERROR "Could not open file \"%s\"\n" RESET, path); - exit(-1); - } - - fseek(file, 0L, SEEK_END); - *fileSize = ftell(file); - rewind(file); - - char* buffer = (char*)malloc(*fileSize + 1); - - if (buffer == NULL) { - fprintf(stderr, ERROR "Not enough memory to read \"%s\"\n" RESET, path); - exit(-1); - } - - size_t bytesRead = fread(buffer, sizeof(char), *fileSize, file); - - buffer[*fileSize] = '\0'; //NOTE: fread doesn't append this - - if (bytesRead < *fileSize) { - fprintf(stderr, ERROR "Could not read file \"%s\"\n" RESET, path); - exit(-1); - } - - fclose(file); - - return buffer; -} - -static unsigned char* compileString(char* source, size_t* size) { - Lexer lexer; - Parser parser; - Compiler compiler; - - initLexer(&lexer, source); - initParser(&parser, &lexer); - initCompiler(&compiler); - - //run the parser until the end of the source - ASTNode* node = scanParser(&parser); - while(node != NULL) { - //pack up and leave - if (node->type == AST_NODEERROR) { - printf(ERROR "error node detected\n" RESET); - freeNode(node); - freeCompiler(&compiler); - freeParser(&parser); - return NULL; - } - - writeCompiler(&compiler, node); - freeNode(node); - node = scanParser(&parser); - } - - //get the bytecode dump - unsigned char* tb = collateCompiler(&compiler, (int*)(size)); - - //cleanup - freeCompiler(&compiler); - freeParser(&parser); - //no lexer to clean up - - //finally - return tb; -} - //exposed functions void initEngine() { //clear diff --git a/core/lib_engine.c b/core/lib_engine.c index 44cf912..aa2fd35 100644 --- a/core/lib_engine.c +++ b/core/lib_engine.c @@ -1,6 +1,7 @@ #include "lib_engine.h" #include "engine.h" +#include "repl_tools.h" #include "memory.h" #include "literal_array.h" @@ -11,85 +12,6 @@ static void fatalError(char* message) { exit(-1); } -//compilation functions -//TODO: move these to their own file -#include "console_colors.h" -#include "lexer.h" -#include "parser.h" -#include "compiler.h" -#include "interpreter.h" - -static char* readFile(char* path, size_t* fileSize) { - FILE* file = fopen(path, "rb"); - - if (file == NULL) { - fprintf(stderr, ERROR "Could not open file \"%s\"\n" RESET, path); - exit(-1); - } - - fseek(file, 0L, SEEK_END); - *fileSize = ftell(file); - rewind(file); - - char* buffer = (char*)malloc(*fileSize + 1); - - if (buffer == NULL) { - fprintf(stderr, ERROR "Not enough memory to read \"%s\"\n" RESET, path); - exit(-1); - } - - size_t bytesRead = fread(buffer, sizeof(char), *fileSize, file); - - buffer[*fileSize] = '\0'; //NOTE: fread doesn't append this - - if (bytesRead < *fileSize) { - fprintf(stderr, ERROR "Could not read file \"%s\"\n" RESET, path); - exit(-1); - } - - fclose(file); - - return buffer; -} - -static unsigned char* compileString(char* source, size_t* size) { - Lexer lexer; - Parser parser; - Compiler compiler; - - initLexer(&lexer, source); - initParser(&parser, &lexer); - initCompiler(&compiler); - - //run the parser until the end of the source - ASTNode* node = scanParser(&parser); - while(node != NULL) { - //pack up and leave - if (node->type == AST_NODEERROR) { - printf(ERROR "error node detected\n" RESET); - freeNode(node); - freeCompiler(&compiler); - freeParser(&parser); - return NULL; - } - - writeCompiler(&compiler, node); - freeNode(node); - node = scanParser(&parser); - } - - //get the bytecode dump - unsigned char* tb = collateCompiler(&compiler, (int*)(size)); - - //cleanup - freeCompiler(&compiler); - freeParser(&parser); - //no lexer to clean up - - //finally - return tb; -} - //native functions to be called static int nativeInitWindow(Interpreter* interpreter, LiteralArray* arguments) { if (engine.window != NULL) { diff --git a/core/repl_tools.c b/core/repl_tools.c new file mode 100644 index 0000000..a115525 --- /dev/null +++ b/core/repl_tools.c @@ -0,0 +1,141 @@ +#include "repl_tools.h" +#include "lib_standard.h" + +#include "console_colors.h" + +#include "lexer.h" +#include "parser.h" +#include "compiler.h" +#include "interpreter.h" + +#include +#include + +//IO functions +char* readFile(char* path, size_t* fileSize) { + FILE* file = fopen(path, "rb"); + + if (file == NULL) { + fprintf(stderr, ERROR "Could not open file \"%s\"\n" RESET, path); + exit(-1); + } + + fseek(file, 0L, SEEK_END); + *fileSize = ftell(file); + rewind(file); + + char* buffer = (char*)malloc(*fileSize + 1); + + if (buffer == NULL) { + fprintf(stderr, ERROR "Not enough memory to read \"%s\"\n" RESET, path); + exit(-1); + } + + size_t bytesRead = fread(buffer, sizeof(char), *fileSize, file); + + buffer[*fileSize] = '\0'; //NOTE: fread doesn't append this + + if (bytesRead < *fileSize) { + fprintf(stderr, ERROR "Could not read file \"%s\"\n" RESET, path); + exit(-1); + } + + fclose(file); + + return buffer; +} + +void writeFile(char* path, unsigned char* bytes, size_t size) { + FILE* file = fopen(path, "wb"); + + if (file == NULL) { + fprintf(stderr, ERROR "Could not open file \"%s\"\n" RESET, path); + exit(-1); + } + + int written = fwrite(bytes, size, 1, file); + + if (written != 1) { + fprintf(stderr, ERROR "Could not write file \"%s\"\n" RESET, path); + exit(-1); + } + + fclose(file); +} + +//repl functions +unsigned char* compileString(char* source, size_t* size) { + Lexer lexer; + Parser parser; + Compiler compiler; + + initLexer(&lexer, source); + initParser(&parser, &lexer); + initCompiler(&compiler); + + //run the parser until the end of the source + ASTNode* node = scanParser(&parser); + while(node != NULL) { + //pack up and leave + if (node->type == AST_NODEERROR) { + printf(ERROR "error node detected\n" RESET); + freeNode(node); + freeCompiler(&compiler); + freeParser(&parser); + return NULL; + } + + writeCompiler(&compiler, node); + freeNode(node); + node = scanParser(&parser); + } + + //get the bytecode dump + unsigned char* tb = collateCompiler(&compiler, (int*)(size)); + + //cleanup + freeCompiler(&compiler); + freeParser(&parser); + //no lexer to clean up + + //finally + return tb; +} + +void runBinary(unsigned char* tb, size_t size) { + Interpreter interpreter; + initInterpreter(&interpreter); + + //inject the libs + injectNativeHook(&interpreter, "standard", hookStandard); + + runInterpreter(&interpreter, tb, size); + freeInterpreter(&interpreter); +} + +void runBinaryFile(char* fname) { + size_t size = 0; //not used + unsigned char* tb = (unsigned char*)readFile(fname, &size); + if (!tb) { + return; + } + runBinary(tb, size); + //interpreter takes ownership of the binary data +} + +void runSource(char* source) { + size_t size = 0; + unsigned char* tb = compileString(source, &size); + if (!tb) { + return; + } + + runBinary(tb, size); +} + +void runSourceFile(char* fname) { + size_t size = 0; //not used + char* source = readFile(fname, &size); + runSource(source); + free((void*)source); +} diff --git a/core/repl_tools.h b/core/repl_tools.h new file mode 100644 index 0000000..9ef421a --- /dev/null +++ b/core/repl_tools.h @@ -0,0 +1,14 @@ +#pragma once + +#include "common.h" + +char* readFile(char* path, size_t* fileSize); +void writeFile(char* path, unsigned char* bytes, size_t size); + +unsigned char* compileString(char* source, size_t* size); + +void runBinary(unsigned char* tb, size_t size); +void runBinaryFile(char* fname); +void runSource(char* source); +void runSourceFile(char* fname); + diff --git a/test/test_engine_node.c b/test/test_engine_node.c index 59fe058..7ad9020 100644 --- a/test/test_engine_node.c +++ b/test/test_engine_node.c @@ -4,6 +4,7 @@ #include "parser.h" #include "compiler.h" #include "interpreter.h" +#include "repl_tools.h" #include "console_colors.h" #include @@ -15,78 +16,6 @@ static void noPrintFn(const char* output) { //NO OP } -//compilation functions -char* readFile(char* path, size_t* fileSize) { - FILE* file = fopen(path, "rb"); - - if (file == NULL) { - fprintf(stderr, ERROR "Could not open file \"%s\"\n" RESET, path); - exit(-1); - } - - fseek(file, 0L, SEEK_END); - *fileSize = ftell(file); - rewind(file); - - char* buffer = (char*)malloc(*fileSize + 1); - - if (buffer == NULL) { - fprintf(stderr, ERROR "Not enough memory to read \"%s\"\n" RESET, path); - exit(-1); - } - - size_t bytesRead = fread(buffer, sizeof(char), *fileSize, file); - - buffer[*fileSize] = '\0'; //NOTE: fread doesn't append this - - if (bytesRead < *fileSize) { - fprintf(stderr, ERROR "Could not read file \"%s\"\n" RESET, path); - exit(-1); - } - - fclose(file); - - return buffer; -} - -unsigned char* compileString(char* source, size_t* size) { - Lexer lexer; - Parser parser; - Compiler compiler; - - initLexer(&lexer, source); - initParser(&parser, &lexer); - initCompiler(&compiler); - - //run the parser until the end of the source - ASTNode* node = scanParser(&parser); - while(node != NULL) { - //pack up and leave - if (node->type == AST_NODEERROR) { - printf(ERROR "error node detected\n" RESET); - freeNode(node); - freeCompiler(&compiler); - freeParser(&parser); - return NULL; - } - - writeCompiler(&compiler, node); - freeNode(node); - node = scanParser(&parser); - } - - //get the bytecode dump - unsigned char* tb = collateCompiler(&compiler, (int*)(size)); - - //cleanup - freeCompiler(&compiler); - freeParser(&parser); - //no lexer to clean up - - //finally - return tb; -} - int main() { { //setup interpreter