All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nl.weeaboo.lua2.stdlib.StringInputStream Maven / Gradle / Ivy

package nl.weeaboo.lua2.stdlib;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;

import javax.annotation.Nullable;

import nl.weeaboo.lua2.io.LuaSerializable;
import nl.weeaboo.lua2.vm.LuaNil;
import nl.weeaboo.lua2.vm.LuaValue;

@LuaSerializable
final class StringInputStream extends InputStream implements Serializable {

    private static final long serialVersionUID = 1L;

    private LuaValue func;
    private @Nullable InputStream buffered;

    StringInputStream(LuaValue func) {
        this.func = func;
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int r = (buffered != null ? buffered.read(b, off, len) : -1);
        if (r < 0) {
            fillBuffer();
            if (buffered != null) {
                r = buffered.read(b, off, len);
            }
        }
        return r;
    }

    @Override
    public int read() throws IOException {
        int r = (buffered != null ? buffered.read() : -1);
        if (r < 0) {
            fillBuffer();
            if (buffered != null) {
                r = buffered.read();
            }
        }
        return r;
    }

    private void fillBuffer() {
        if (func.isnil()) {
            return;
        }

        LuaValue val = func.call();
        if (val.isnil() || val.length() == 0) {
            func = LuaNil.NIL;
            buffered = null;
        } else {
            buffered = val.checkstring().toInputStream();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy