mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Добавлен модуль для работы с файлами
This commit is contained in:
parent
1173c21dfe
commit
d737844913
369
src/com/annimon/ownlang/lib/modules/files.java
Normal file
369
src/com/annimon/ownlang/lib/modules/files.java
Normal file
@ -0,0 +1,369 @@
|
||||
package com.annimon.ownlang.lib.modules;
|
||||
|
||||
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
|
||||
import com.annimon.ownlang.lib.*;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public final class files implements Module {
|
||||
|
||||
private static Map<Integer, FileInfo> files;
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
files = new HashMap<>();
|
||||
|
||||
Functions.set("fopen", new fopen());
|
||||
Functions.set("readBoolean", new readBoolean());
|
||||
Functions.set("readByte", new readByte());
|
||||
Functions.set("readBytes", new readBytes());
|
||||
Functions.set("readAllBytes", new readAllBytes());
|
||||
Functions.set("readChar", new readChar());
|
||||
Functions.set("readShort", new readShort());
|
||||
Functions.set("readInt", new readInt());
|
||||
Functions.set("readLong", new readLong());
|
||||
Functions.set("readFloat", new readFloat());
|
||||
Functions.set("readDouble", new readDouble());
|
||||
Functions.set("readUTF", new readUTF());
|
||||
Functions.set("readLine", new readLine());
|
||||
Functions.set("readText", new readText());
|
||||
Functions.set("writeBoolean", new writeBoolean());
|
||||
Functions.set("writeByte", new writeByte());
|
||||
Functions.set("writeChar", new writeChar());
|
||||
Functions.set("writeShort", new writeShort());
|
||||
Functions.set("writeInt", new writeInt());
|
||||
Functions.set("writeLong", new writeLong());
|
||||
Functions.set("writeFloat", new writeFloat());
|
||||
Functions.set("writeDouble", new writeDouble());
|
||||
Functions.set("writeUTF", new writeUTF());
|
||||
Functions.set("writeLine", new writeLine());
|
||||
Functions.set("flush", new flush());
|
||||
Functions.set("fclose", new fclose());
|
||||
}
|
||||
|
||||
private static class fopen implements Function {
|
||||
|
||||
@Override
|
||||
public Value execute(Value... args) {
|
||||
if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected");
|
||||
|
||||
final File file = new File(args[0].asString());
|
||||
try {
|
||||
if (args.length > 1) {
|
||||
return process(file, args[1].asString().toLowerCase());
|
||||
}
|
||||
return process(file, "r");
|
||||
} catch (IOException ioe) {
|
||||
return new NumberValue(-1);
|
||||
}
|
||||
}
|
||||
|
||||
private Value process(File file, String mode) throws IOException {
|
||||
DataInputStream dis = null;
|
||||
BufferedReader reader = null;
|
||||
if (mode.contains("rb")) {
|
||||
dis = new DataInputStream(new FileInputStream(file));
|
||||
} else if (mode.contains("r")) {
|
||||
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
|
||||
}
|
||||
|
||||
DataOutputStream dos = null;
|
||||
BufferedWriter writer = null;
|
||||
if (mode.contains("wb")) {
|
||||
dos = new DataOutputStream(new FileOutputStream(file));
|
||||
} else if (mode.contains("w")) {
|
||||
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
|
||||
}
|
||||
|
||||
final int key = files.size();
|
||||
files.put(key, new FileInfo(file, dis, dos, reader, writer));
|
||||
return new NumberValue(key);
|
||||
}
|
||||
}
|
||||
|
||||
private static abstract class FileFunction implements Function {
|
||||
|
||||
@Override
|
||||
public Value execute(Value... args) {
|
||||
if (args.length < 1) throw new ArgumentsMismatchException("File descriptor expected");
|
||||
final int key = (int) args[0].asNumber();
|
||||
try {
|
||||
return execute(files.get(key), args);
|
||||
} catch (IOException ioe) {
|
||||
return NumberValue.ZERO;
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract Value execute(FileInfo fileInfo, Value[] args) throws IOException;
|
||||
}
|
||||
|
||||
private static class readBoolean extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new NumberValue(fileInfo.dis.readBoolean() ? 1 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
private static class readByte extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new NumberValue(fileInfo.dis.readByte());
|
||||
}
|
||||
}
|
||||
|
||||
private static class readBytes extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
final ArrayValue array = (ArrayValue) args[1];
|
||||
int offset = 0, length = array.size();
|
||||
if (args.length > 3) {
|
||||
offset = (int) args[2].asNumber();
|
||||
length = (int) args[3].asNumber();
|
||||
}
|
||||
|
||||
final byte[] buffer = new byte[length];
|
||||
final int readed = fileInfo.dis.read(buffer, offset, length);
|
||||
for (int i = 0; i < readed; i++) {
|
||||
array.set(i, new NumberValue(buffer[i]));
|
||||
}
|
||||
return new NumberValue(readed);
|
||||
}
|
||||
}
|
||||
|
||||
private static class readAllBytes extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
final int bufferSize = 4096;
|
||||
final byte[] buffer = new byte[bufferSize];
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
int readed;
|
||||
while ((readed = fileInfo.dis.read(buffer, 0, bufferSize)) != -1) {
|
||||
baos.write(buffer, 0, readed);
|
||||
}
|
||||
baos.flush();
|
||||
baos.close();
|
||||
final byte[] bytes = baos.toByteArray();
|
||||
final int size = bytes.length;
|
||||
final ArrayValue result = new ArrayValue(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
result.set(i, new NumberValue(bytes[i]));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
private static class readChar extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new NumberValue(fileInfo.dis.readChar());
|
||||
}
|
||||
}
|
||||
|
||||
private static class readShort extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new NumberValue(fileInfo.dis.readShort());
|
||||
}
|
||||
}
|
||||
|
||||
private static class readInt extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new NumberValue(fileInfo.dis.readInt());
|
||||
}
|
||||
}
|
||||
|
||||
private static class readLong extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new NumberValue(fileInfo.dis.readLong());
|
||||
}
|
||||
}
|
||||
|
||||
private static class readFloat extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new NumberValue(fileInfo.dis.readFloat());
|
||||
}
|
||||
}
|
||||
|
||||
private static class readDouble extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new NumberValue(fileInfo.dis.readDouble());
|
||||
}
|
||||
}
|
||||
|
||||
private static class readUTF extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new StringValue(fileInfo.dis.readUTF());
|
||||
}
|
||||
}
|
||||
|
||||
private static class readLine extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
return new StringValue(fileInfo.reader.readLine());
|
||||
}
|
||||
}
|
||||
|
||||
private static class readText extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
int ch;
|
||||
while ((ch = fileInfo.reader.read()) != -1) {
|
||||
sb.append((char) ch);
|
||||
}
|
||||
return new StringValue(sb.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static class writeBoolean extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
fileInfo.dos.writeBoolean(args[1].asNumber() != 0);
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class writeByte extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
fileInfo.dos.writeByte((byte) args[1].asNumber());
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class writeChar extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
final char ch = (args[1].type() == Types.NUMBER)
|
||||
? ((char) args[1].asNumber())
|
||||
: args[1].asString().charAt(0);
|
||||
fileInfo.dos.writeChar(ch);
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class writeShort extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
fileInfo.dos.writeShort((short) args[1].asNumber());
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class writeInt extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
fileInfo.dos.writeInt((int) args[1].asNumber());
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class writeLong extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
fileInfo.dos.writeLong((long) args[1].asNumber());
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class writeFloat extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
fileInfo.dos.writeFloat((float) args[1].asNumber());
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class writeDouble extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
fileInfo.dos.writeDouble(args[1].asNumber());
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class writeUTF extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
fileInfo.dos.writeUTF(args[1].asString());
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class writeLine extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
fileInfo.dos.writeDouble(args[1].asNumber());
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class flush extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
if (fileInfo.dos != null) {
|
||||
fileInfo.dos.flush();
|
||||
}
|
||||
if (fileInfo.writer != null) {
|
||||
fileInfo.writer.flush();
|
||||
}
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class fclose extends FileFunction {
|
||||
@Override
|
||||
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
|
||||
if (fileInfo.dis != null) {
|
||||
fileInfo.dis.close();
|
||||
}
|
||||
if (fileInfo.dos != null) {
|
||||
fileInfo.dos.close();
|
||||
}
|
||||
if (fileInfo.reader != null) {
|
||||
fileInfo.reader.close();
|
||||
}
|
||||
if (fileInfo.writer != null) {
|
||||
fileInfo.writer.close();
|
||||
}
|
||||
return NumberValue.ONE;
|
||||
}
|
||||
}
|
||||
|
||||
private static class FileInfo {
|
||||
File file;
|
||||
DataInputStream dis;
|
||||
DataOutputStream dos;
|
||||
BufferedReader reader;
|
||||
BufferedWriter writer;
|
||||
|
||||
public FileInfo(File file, DataInputStream dis, DataOutputStream dos, BufferedReader reader, BufferedWriter writer) {
|
||||
this.file = file;
|
||||
this.dis = dis;
|
||||
this.dos = dos;
|
||||
this.reader = reader;
|
||||
this.writer = writer;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user