import unix.*; currentDirectory() { var buflen = 1024; var buf = allocateMemory(Int8, buflen); var result = getcwd(buf, UInt64(buflen)); while (result == Type(result)(0) and errno() == ERANGE) { freeMemory(buf); buflen *= 2; buf = allocateMemory(Int8, buflen); result = getcwd(buf, UInt64(buflen)); } if (result == Type(result)(0)) { freeMemory(buf); error(errorMessage()); } var stringbuf = CStringRef(buf); var result = String(CStringRef(buf)); freeMemory(buf); return result; } [T | String?(T)] changeDirectory(path: T) { syscall(chdir, cstring(path)); } procedure directoryFiles; overload directoryFiles() = directoryFiles("."); [T | String?(T)] overload directoryFiles(path: T) { var dirp = opendir(cstring(path)); if (dirp == Type(dirp)(0)) error(errorMessage()); var files = Vector[String](); var dirent = Struct_dirent(); var resultPointer = Pointer[Struct_dirent](0); var returnVal = readdir_r(dirp, &dirent, &resultPointer); while (returnVal == 0 and resultPointer != Type(resultPointer)(0)) { var file = CStringRef(Pointer[Int8](&dirent.d_name)); if (file != "." and file != "..") push(files, String(file)); returnVal = readdir_r(dirp, &dirent, &resultPointer); } if (returnVal != 0) { var readdirErrorMsg = errorMessage(); syscallNoThrow(closedir, dirp); error(readdirErrorMsg); } else { syscall(closedir, dirp); return files; } }