This commit is contained in:
cozis
2022-08-16 18:54:49 +02:00
parent 4d4e365002
commit 3209afb513
5 changed files with 55 additions and 52 deletions
+1 -2
View File
@@ -1,5 +1,4 @@
json = import("json.noja");
json, err = import("json.noja");
utils = import("utils.noja"); utils = import("utils.noja");
assert(json.parse("null") == none); assert(json.parse("null") == none);
+5 -18
View File
@@ -52,33 +52,20 @@ static int bin_print(Runtime *runtime, Object **argv, unsigned int argc, Object
return 0; return 0;
} }
static const char *getCurrentScriptAbsolutePath(Runtime *runtime)
{
Executable *exe = Runtime_GetCurrentExecutable(runtime);
assert(exe != NULL);
Source *src = Executable_GetSource(exe);
if(src == NULL)
return NULL;
const char *path = Source_GetAbsolutePath(src);
if(path == NULL)
return NULL;
assert(path[0] != '\0');
return path;
}
// Returns the length written in buff (not considering the zero byte) // Returns the length written in buff (not considering the zero byte)
static size_t getCurrentScriptFolder(Runtime *runtime, char *buff, size_t buffsize) static size_t getCurrentScriptFolder(Runtime *runtime, char *buff, size_t buffsize)
{ {
const char *path = getCurrentScriptAbsolutePath(runtime); const char *path = Runtime_GetCurrentScriptAbsolutePath(runtime);
if(path == NULL) { if(path == NULL) {
if(getcwd(buff, sizeof(buffsize)) == NULL) if(getcwd(buff, sizeof(buffsize)) == NULL)
return 0; return 0;
return strlen(buff); return strlen(buff);
} }
// This following block is a custom implementation
// of [dirname], which doesn't write into the input
// string and is way buggier. It will for sure give
// problems in the future!!
size_t dir_len; size_t dir_len;
{ {
// This is buggy code!! // This is buggy code!!
+17
View File
@@ -56,6 +56,23 @@ struct xRuntime {
Heap *heap; Heap *heap;
}; };
const char *Runtime_GetCurrentScriptAbsolutePath(Runtime *runtime)
{
Executable *exe = Runtime_GetCurrentExecutable(runtime);
assert(exe != NULL);
Source *src = Executable_GetSource(exe);
if(src == NULL)
return NULL;
const char *path = Source_GetAbsolutePath(src);
if(path == NULL)
return NULL;
assert(path[0] != '\0');
return path;
}
Stack *Runtime_GetStack(Runtime *runtime) Stack *Runtime_GetStack(Runtime *runtime)
{ {
return Stack_Copy(runtime->stack, 1); return Stack_Copy(runtime->stack, 1);
+1
View File
@@ -51,6 +51,7 @@ Object* Runtime_GetBuiltins(Runtime *runtime);
void Runtime_SetBuiltins(Runtime *runtime, Object *builtins); void Runtime_SetBuiltins(Runtime *runtime, Object *builtins);
int Runtime_GetCurrentIndex(Runtime *runtime); int Runtime_GetCurrentIndex(Runtime *runtime);
Executable *Runtime_GetCurrentExecutable(Runtime *runtime); Executable *Runtime_GetCurrentExecutable(Runtime *runtime);
const char *Runtime_GetCurrentScriptAbsolutePath(Runtime *runtime);
Snapshot *Snapshot_New(Runtime *runtime); Snapshot *Snapshot_New(Runtime *runtime);
void Snapshot_Free(Snapshot *snapshot); void Snapshot_Free(Snapshot *snapshot);
void Snapshot_Print(Snapshot *snapshot, FILE *fp); void Snapshot_Print(Snapshot *snapshot, FILE *fp);
+28 -29
View File
@@ -82,6 +82,32 @@ const char *Source_GetAbsolutePath(Source *src)
return NULL; return NULL;
} }
const char *makePathAbsolute(const char *path, char *buff, size_t buffsize)
{
if(path[0] == '/')
// It's already absolute.
return path;
if(getcwd(buff, buffsize) == NULL)
return NULL;
size_t written = strlen(buff);
assert(buff[written-1] != '/');
if(written+1 >= buffsize)
return NULL; // No space for the / following the cwd.
buff[written++] = '/';
size_t n = strlen(path);
if(written + n >= buffsize)
return NULL;
memcpy(buff + written, path, n);
buff[written + n] = '\0';
return buff;
}
Source *Source_FromFile(const char *file, Error *error) Source *Source_FromFile(const char *file, Error *error)
{ {
assert(file != NULL); assert(file != NULL);
@@ -92,39 +118,12 @@ Source *Source_FromFile(const char *file, Error *error)
} }
char maybe[1024]; char maybe[1024];
const char *abs_path; const char *abs_path = makePathAbsolute(file, maybe, sizeof(maybe));
if(abs_path == NULL) {
if(file[0] == '/')
abs_path = file;
else {
if(getcwd(maybe, sizeof(maybe)) == NULL) {
Error_Report(error, 0, "Internal buffer is too small"); Error_Report(error, 0, "Internal buffer is too small");
return NULL; return NULL;
} }
size_t written = strlen(maybe);
assert(maybe[written-1] != '/');
if(written+1 >= sizeof(maybe)) {
Error_Report(error, 0, "Internal buffer is too small");
return NULL;
}
maybe[written] = '/';
written += 1;
size_t n = strlen(file);
if(written + n >= sizeof(maybe)) {
Error_Report(error, 0, "Internal buffer is too small");
return NULL;
}
memcpy(maybe + written, file, n);
maybe[written + n] = '\0';
abs_path = maybe;
}
// Open the file and get it's size. // Open the file and get it's size.
// at the end of the block, the file // at the end of the block, the file
// cursor will point at the start of // cursor will point at the start of