summaryrefslogtreecommitdiff
path: root/examples/scala-js/javalib/src/main/scala/java/io/ByteArrayInputStream.scala
blob: 697e07b2246b5f6865614ebb22d87dce74258b91 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package java.io

class ByteArrayInputStream(
    protected val buf: Array[Byte],
    offset: Int, length: Int) extends InputStream {

  protected val count: Int = offset + length
  protected var mark: Int = offset
  protected var pos: Int = offset

  def this(buf: Array[Byte]) = this(buf, 0, buf.length)

  override def read(): Int = {
    if (pos >= count)
      -1
    else {
      val res = buf(pos) & 0xFF // convert to unsigned int
      pos += 1
      res
    }
  }

  override def read(b: Array[Byte], off: Int, reqLen: Int): Int = {
    if (off < 0 || reqLen < 0 || reqLen > b.length - off)
      throw new IndexOutOfBoundsException

    val len = Math.min(reqLen, count - pos)

    if (reqLen == 0)
      0  // 0 requested, 0 returned
    else if (len == 0)
      -1 // nothing to read at all
    else {
      System.arraycopy(buf, pos, b, off, len)
      pos += len
      len
    }
  }

  override def skip(n: Long): Long = {
    val k = Math.max(0, Math.min(n, count - pos))
    pos += k.toInt
    k.toLong
  }

  override def available(): Int = count - pos

  override def markSupported(): Boolean = true

  override def mark(readlimit: Int): Unit =
    mark = pos

  override def reset(): Unit =
    pos = mark

  override def close(): Unit = ()

}