diff --git a/.github/workflows/msys2-cross-compile.yml b/.github/workflows/msys2-cross-compile.yml
new file mode 100644
index 0000000..770ea3b
--- /dev/null
+++ b/.github/workflows/msys2-cross-compile.yml
@@ -0,0 +1,20 @@
+name: MSYS2
+on: [push, pull_request]
+
+jobs:
+ msys2-mingw64:
+ runs-on: windows-latest
+ defaults:
+ run:
+ shell: msys2 {0}
+ steps:
+ - uses: actions/checkout@v3
+ - uses: msys2/setup-msys2@v2
+ with:
+ msystem: MINGW64
+ update: true
+ install: mingw-w64-x86_64-gcc mingw-w64-x86_64-glib2 bison flex mingw-w64-x86_64-llvm cmake git make
+ - name: CI-Build
+ run: |
+ echo 'Running in MSYS2!'
+ ./ci-build.sh
\ No newline at end of file
diff --git a/README.md b/README.md
index faca249..daaaf32 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,31 @@
-# Gemstone
-Gemstone is a programming language compiler written in C with lex and yacc.
+
+
+
+
+
+## Gemstone
+
+Gemstone is a programming language compiler (short: GSC) written in C based on flex and GNU bison.
+It uses LLVM to produce optimized native binaries for many platforms and uses its own builtin build system for more complex project management.
## Dependencies (build)
### Windows 11
-For setup instruction see issue #30
-
-Requires:
-- Microsoft Build Tools 2022 (includes: CMake, MSVC)
-- WinFlexBison [find it here](https://github.com/lexxmark/winflexbison) (needs to be in PATH)
+#### MSYS2
+Install MSYS2 under Windows 11. Open the MingGW64 environment.
+Install the following packages:
+```
+pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-glib2 bison flex mingw-w64-x86_64-llvm cmake git make
+```
+Clone the repository and build the gemstone compiler:
+```
+cmake . && make release
+```
### GNU/Linux
Requires:
@@ -20,6 +34,8 @@ Requires:
- Make
- bison
- flex
+- LLVM
+- Glib 2.0
## Writing Tests
diff --git a/ci-build.sh b/ci-build.sh
new file mode 100755
index 0000000..8b09b06
--- /dev/null
+++ b/ci-build.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmake .
+make release
diff --git a/src/ast/ast.c b/src/ast/ast.c
index 1381331..a9c1af6 100644
--- a/src/ast/ast.c
+++ b/src/ast/ast.c
@@ -215,6 +215,7 @@ void AST_delete_node(struct AST_Node_t *node) {
DEBUG("Deleting AST node: %p", node);
if (node->parent != NULL) {
+ [[maybe_unused]]
const struct AST_Node_t* child = AST_detach_child(node->parent, node);
assert(child == node);
}
diff --git a/src/io/files.c b/src/io/files.c
index 9ca0a93..ecb2662 100644
--- a/src/io/files.c
+++ b/src/io/files.c
@@ -14,9 +14,15 @@
#define MAX_PATH_BYTES PATH_MAX
+#define min(a, b) ((a) > (b) ? (b) : (a))
+
#elif defined(_WIN32) || defined(WIN32)
#include
+// for _fullpath
+#include
+// for _mkdir
+#include
#define MAX_PATH_BYTES _MAX_PATH
@@ -66,10 +72,6 @@ void delete_files(ModuleFileStack *stack) {
// seeking the current line in print_diagnostic()
#define SEEK_BUF_BYTES 256
-static inline unsigned long int min(unsigned long int a, unsigned long int b) {
- return a > b ? b : a;
-}
-
// behaves like fgets except that it has defined behavior when n == 1
static void custom_fgets(char *buffer, size_t n, FILE *stream) {
if (n == 1) {
@@ -123,15 +125,15 @@ void print_diagnostic(ModuleFile *file, TokenLocation *location, Message kind, c
mem_free((void *) absolute_path);
- const size_t lines = location->line_end - location->line_start + 1;
+ const unsigned long int lines = location->line_end - location->line_start + 1;
- for (size_t l = 0; l < lines; l++) {
+ for (unsigned long int l = 0; l < lines; l++) {
printf(" %4ld | ", location->line_start + l);
- size_t chars = 0;
+ unsigned long int chars = 0;
// print line before token group start
- size_t limit = min(location->col_start, SEEK_BUF_BYTES);
+ unsigned long int limit = min(location->col_start, SEEK_BUF_BYTES);
while (limit > 1) {
custom_fgets(buffer, (int) limit, file->handle);
chars += printf("%s", buffer);
@@ -169,13 +171,13 @@ void print_diagnostic(ModuleFile *file, TokenLocation *location, Message kind, c
}
printf(" | ");
- for (size_t i = 1; i < location->col_start; i++) {
+ for (unsigned long int i = 1; i < location->col_start; i++) {
printf(" ");
}
printf("%s", accent_color);
printf("^");
- for (size_t i = 0; i < location->col_end - location->col_start; i++) {
+ for (unsigned long int i = 0; i < location->col_end - location->col_start; i++) {
printf("~");
}
@@ -321,7 +323,7 @@ const char *get_absolute_path(const char *path) {
#elif defined(_WIN32) || defined(WIN32)
// use Windows CRT specific function
char absolute_path[MAX_PATH_BYTES];
- _fullpath(path, absolute_path, _MAX_PATH);
+ _fullpath((char*) path, absolute_path, _MAX_PATH);
#endif
return mem_strdup(MemoryNamespaceIo, absolute_path);
diff --git a/src/io/files.h b/src/io/files.h
index 61c7ebb..c05f587 100644
--- a/src/io/files.h
+++ b/src/io/files.h
@@ -15,9 +15,9 @@
#endif
typedef struct FileDiagnosticStatistics_t {
- size_t error_count;
- size_t warning_count;
- size_t info_count;
+ unsigned long int error_count;
+ unsigned long int warning_count;
+ unsigned long int info_count;
} FileDiagnosticStatistics;
typedef struct ModuleFile_t {
diff --git a/src/sys/col.c b/src/sys/col.c
index 76260ec..afd78ba 100644
--- a/src/sys/col.c
+++ b/src/sys/col.c
@@ -71,8 +71,7 @@ int stdout_supports_ansi_esc() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (!GetConsoleMode(hConsole, &mode)) {
- ERROR("failed to get console mode");
- return ANSI_ENABLED;
+ return ASNI_DISABLED;
}
if ((mode & ENABLE_VIRTUAL_TERMINAL_INPUT) |