Mercurial > hg > Members > kono > jpf-core
view src/classes/java/io/InputStreamReader.java @ 34:49be04cc6389 default tip java9-try
cyclic dependency ...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 19 Dec 2017 11:21:23 +0900 |
parents | 61d41facf527 |
children |
line wrap: on
line source
/* * Copyright (C) 2014, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * All rights reserved. * * The Java Pathfinder core (jpf-core) platform is licensed under the * Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0. * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package java.io; /** * how hard can it be to transform byte(s) into a char? I hate Unicode */ public class InputStreamReader extends Reader { static final int BUF_SIZE=128; private static Object lock = new Object(); // our peer has state InputStream in; byte[] bbuf = new byte[BUF_SIZE]; String charSetName=null; public InputStreamReader (InputStream in){ this.in = in; } public InputStreamReader (InputStream in,String charSetName){ this.in = in; this.charSetName = charSetName; } @Override public void close () throws IOException { in.close(); } private native int decode (int b, boolean endOfInput); @Override public boolean ready() { try { return (in.available() > 0); } catch (IOException iox){ return false; } } @Override public int read () throws IOException { synchronized (lock){ while (true){ int b = in.read(); if (b < 0){ return -1; } int c = decode(b, (in.available() == 0)); if (c >= 0 ) { return c; } } } } native int decode (byte[] inBuf,int len, char[] outBuf, int off, boolean endOfInput); @Override public int read (char[] cbuf, int off, int len) throws IOException { int r = 0; boolean available = true; synchronized (lock){ while (available && r < len){ // <2do> - so what if that backtracks? the peer might have // iteration-specific state that gets lost. see native peer comments int b = in.read(bbuf, 0, Math.min(len-r,bbuf.length)); if (b < 0){ return (r == 0) ? -1 : r; } // true if we have not reach the end of the input stream "in" // and there are still more bytes available to be read available = (in.available() > 0); r += decode(bbuf,b, cbuf,off+r, !available); } } return r; } }