context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(workspaceSymbolProvider));
context.subscriptions.push(vscode.languages.registerDefinitionProvider({ 'language': 'onyx' }, peekFileDefinitionProvider));
- let serverOptions: vslc.ServerOptions = {
- command: "onyx-lsp",
- transport: vslc.TransportKind.stdio,
- };
-
- let clientOptions: vslc.LanguageClientOptions = {
- documentSelector: [
- { scheme: "file", language: "onyx" },
- ],
- connectionOptions: {
- cancellationStrategy: null,
- maxRestartCount: 5
- }
- };
-
- client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions);
-
- client.start();
+ let onyx_path = process.env['ONYX_PATH'];
+ if (!onyx_path) {
+ onyx_path = require('os').homedir() + "/.onyx";
+ process.env["ONYX_PATH"] = onyx_path;
+ process.env["PATH"] = process.env["PATH"] + ":" + onyx_path + "/bin"
+ }
+
+ if (onyx_path) {
+ let serverOptions: vslc.ServerOptions = {
+ command: `${onyx_path}/bin/onyx`,
+ args: ["lsp"],
+ transport: vslc.TransportKind.stdio,
+ };
+
+ let clientOptions: vslc.LanguageClientOptions = {
+ documentSelector: [
+ { scheme: "file", language: "onyx" },
+ ],
+ connectionOptions: {
+ cancellationStrategy: null,
+ maxRestartCount: 5
+ }
+ };
+
+ client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions);
+
+ client.start();
+ }
console.appendLine("Onyx Extension loaded.");
}
context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, documentSymbolProvider));
context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(workspaceSymbolProvider));
context.subscriptions.push(vscode.languages.registerDefinitionProvider({ 'language': 'onyx' }, peekFileDefinitionProvider));
- let serverOptions = {
- command: "onyx-lsp",
- transport: vslc.TransportKind.stdio,
- };
- let clientOptions = {
- documentSelector: [
- { scheme: "file", language: "onyx" },
- ],
- connectionOptions: {
- cancellationStrategy: null,
- maxRestartCount: 5
- }
- };
- client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions);
- client.start();
+ let onyx_path = process.env['ONYX_PATH'];
+ if (!onyx_path) {
+ onyx_path = require('os').homedir() + "/.onyx";
+ process.env["ONYX_PATH"] = onyx_path;
+ process.env["PATH"] = process.env["PATH"] + ":" + onyx_path + "/bin";
+ }
+ if (onyx_path) {
+ let serverOptions = {
+ command: `${onyx_path}/bin/onyx`,
+ args: ["lsp"],
+ transport: vslc.TransportKind.stdio,
+ };
+ let clientOptions = {
+ documentSelector: [
+ { scheme: "file", language: "onyx" },
+ ],
+ connectionOptions: {
+ cancellationStrategy: null,
+ maxRestartCount: 5
+ }
+ };
+ client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions);
+ client.start();
+ }
console.appendLine("Onyx Extension loaded.");
});
}
#define _BH_LINUX 1
#endif
+#if defined(__MACH__) && defined(__APPLE__)
+ #define _BH_DARWIN 1
+#endif
+
#include <sys/stat.h>
-#include <malloc.h>
#include <time.h>
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <pthread.h>
- #include <sys/inotify.h>
#include <sys/select.h>
#endif
+#if defined(_BH_LINUX) || defined(_BH_WINDOWS)
+ #include <malloc.h>
+#endif
+
+#if defined(_BH_LINUX)
+ #include <sys/inotify.h>
+#endif
+
+#if defined(_BH_DARWIN)
+ #include <sys/malloc.h>
+#endif
+
#include <stdlib.h>
#include <stdarg.h>
#include <string.h> // TODO: Replace with needed functions
#define forir(var, hi, lo) for (i64 var = (hi); var >= (lo); var--)
#define forll(T, var, start, step) for (T* var = (start); var != NULL; var = (T *) var->step)
-#if defined(BH_DEBUG) && !defined(_BH_WINDOWS)
+#if defined(BH_DEBUG) && defined(_BH_LINUX) && false
#define DEBUG_HERE __asm("int $3")
#else
#define DEBUG_HERE
fd_set fds;
} bh_file_watch;
#endif
-#ifdef _BH_WINDOWS
- // TODO: Make these work on Windows
+#if defined(_BH_WINDOWS) || defined(_BH_DARWIN)
+ // TODO: Make these work on Windows and MacOS
typedef u32 bh_file_watch;
#endif
case bh_allocator_action_alloc: {
#if defined(_BH_WINDOWS)
retval = _aligned_malloc(size, alignment);
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
i32 success = posix_memalign(&retval, alignment, size);
#endif
if (flags & bh_allocator_flag_clear && retval != NULL) {
// TODO: Maybe replace with better custom function
#if defined(_BH_WINDOWS)
retval = _aligned_realloc(prev_memory, size, alignment);
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
retval = realloc(prev_memory, size);
#endif
} break;
case bh_allocator_action_free: {
#if defined(_BH_WINDOWS)
_aligned_free(prev_memory);
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
free(prev_memory);
#endif
} break;
l->magic_number = 0;
#if defined(_BH_WINDOWS)
_aligned_free((void *) l);
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
free((void *) l);
#endif
}
}
file->fd = sd_fd;
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
i32 sd_fd = -1;
switch (stand) {
file->filename = filename;
return BH_FILE_ERROR_NONE;
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
i32 os_mode = 0;
switch (mode & BH_FILE_MODE_MODES) {
if (res) return 1;
else return 0;
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
if (file->fd == 0) {
isize res = read(file->fd, buffer, buff_size);
if (res < 0) return 0;
res = (isize) WriteFile(file->fd, buffer, buff_size, (i32 *) bytes_wrote, NULL);
return res;
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
if (current_offset == offset || file->fd == 1 || file->fd == 2) {
// Standard in and out do like pwrite()
res = write(file->fd, buffer, buff_size);
if (new_offset) *new_offset = res;
return 1;
#endif
+
+#elif defined(_BH_DARWIN)
+ i64 res = lseek(fd, offset, whence);
+ if (res < 0) return 0;
+ if (new_offset) *new_offset = res;
+ return 1;
+#endif
}
// Returns new offset
return err;
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
i32 res = close(file->fd);
if (res < 0)
err = BH_FILE_ERROR_INVALID;
}
void bh_file_flush(bh_file* file) {
- #ifdef _BH_LINUX
+ #ifdef _BH_LINUX || defined (_BH_DARWIN)
fdatasync(file->fd);
#endif
}
if ((s.st_mode & S_IFMT) == S_IFDIR) out->file_type = BH_FILE_TYPE_DIRECTORY;
if ((s.st_mode & S_IFMT) == S_IFREG) out->file_type = BH_FILE_TYPE_FILE;
-#if defined(_BH_LINUX)
+#if defined(_BH_LINUX) || defined (_BH_DARWIN)
if ((s.st_mode & S_IFMT) == S_IFLNK) out->file_type = BH_FILE_TYPE_LINK;
#endif
#if defined(_BH_WINDOWS)
return DeleteFileA(filename);
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
return unlink(filename) == 0;
#endif
}
return result;
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined (_BH_DARWIN)
char* p = realpath(filename, NULL);
// Check if the file did not exists.
}
// NOTE: This assumes the filename is the full path, not relative to anything else.
-#if defined(_BH_LINUX)
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
#define DIR_SEPARATOR '/'
#elif defined(_BH_WINDOWS)
#define DIR_SEPARATOR '\\'
//
// Modifies the path in-place.
char* bh_path_convert_separators(char* path) {
-#if defined(_BH_LINUX)
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
#define DIR_SEPARATOR '/'
#define OTHER_SEPARATOR '\\'
#elif defined(_BH_WINDOWS)
return dir;
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
DIR* dir = opendir(path);
return dir;
#endif
return 1;
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
struct dirent *ent;
while (1) {
ent = readdir(dir);
free(dir);
#endif
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
if (dir == NULL) return;
closedir(dir);
#endif
QueryPerformanceCounter(&result);
return (u64) result.QuadPart;
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined(_BH_DARWIN)
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
duration /= freq.QuadPart;
return duration;
-#elif defined(_BH_LINUX)
+#elif defined(_BH_LINUX) || defined(_BH_DARWIN)
u64 curr = bh_time_curr();
return curr - old;
#endif