Java "oslib"

Admin User, erstellt 04. März 2024
         
package liblet.util;
import nova.Machine;
import nova.Runtime;
import nova.Special;
import nova.Store;
import java.io.*;
public final class oslib {
private static boolean test_directory_files(Object[] args) {
Object url = Machine.deref(Machine.exec_build(args[0]));
Special.check_atom(url);
File file = Runtime.file(Runtime.codebase, (String) url);
String[] entries = file.list();
if (entries == null) {
if (!file.exists()) {
throw Machine.make_error(new Store.Compound("existence_error",
new Object[]{"source_sink", url}));
} else {
throw Machine.make_error(new Store.Compound("resource_error",
new Object[]{"io_exception"}));
}
}
Object res = "[]";
for (int i = entries.length - 1; i >= 0; i--) {
String val = entries[i];
res = new Store.Compound(".", new Object[]{val, res});
}
return Machine.exec_unify(args[1], res);
}
private static boolean test_file_exists(Object[] args) {
Object url = Machine.deref(Machine.exec_build(args[0]));
Special.check_atom(url);
File file = Runtime.file(Runtime.codebase, (String) url);
return file.exists();
}
private static boolean test_make_directory(Object[] args) {
Object url = Machine.deref(Machine.exec_build(args[0]));
Special.check_atom(url);
File file = Runtime.file(Runtime.codebase, (String) url);
if (!file.mkdir()) {
if (!file.exists()) {
throw Machine.make_error(new Store.Compound("existence_error",
new Object[]{"source_sink", url}));
} else {
throw Machine.make_error(new Store.Compound("resource_error",
new Object[]{"io_exception"}));
}
}
return true;
}
private static boolean test_delete_file(Object[] args) {
Object url = Machine.deref(Machine.exec_build(args[0]));
Special.check_atom(url);
File file = Runtime.file(Runtime.codebase, (String) url);
if (file.isDirectory() || !file.delete()) {
if (!file.exists()) {
throw Machine.make_error(new Store.Compound("existence_error",
new Object[]{"source_sink", url}));
} else {
throw Machine.make_error(new Store.Compound("resource_error",
new Object[]{"io_exception"}));
}
}
return true;
}
private static boolean test_copy_binary(Object[] args) {
Object from = Machine.deref(Machine.exec_build(args[0]));
Special.check_atom(from);
File src = Runtime.file(Runtime.codebase, (String) from);
Object to = Machine.deref(Machine.exec_build(args[1]));
Special.check_atom(to);
File dst = Runtime.file(Runtime.codebase, (String) to);
try {
copy_binary(src, dst);
} catch (IOException x) {
if (!src.exists()) {
throw Machine.make_error(new Store.Compound("existence_error",
new Object[]{"source_sink", from}));
} else {
throw Machine.make_error(new Store.Compound("resource_error",
new Object[]{"io_exception"}));
}
}
return true;
}
private static void copy_binary(File src, File dst)
throws IOException {
InputStream bin = new FileInputStream(src);
try {
OutputStream bout = new FileOutputStream(dst);
try {
byte[] buf = new byte[8192];
int len = bin.read(buf);
while (len >= 0) {
if (len > 0)
bout.write(buf, 0, len);
len = bin.read(buf);
}
} finally {
bout.close();
}
} finally {
bin.close();
}
}
public static void main() {
Store.add("directory_files", 2, Special.make_check(oslib::test_directory_files));
Store.add("file_exists", 1, Special.make_check(oslib::test_file_exists));
Store.add("make_directory", 1, Special.make_check(oslib::test_make_directory));
Store.add("delete_file", 1, Special.make_check(oslib::test_delete_file));
Store.add("copy_binary", 2, Special.make_check(oslib::test_copy_binary));
}
}