/* Copyright (C) 1998, 1999  Cygnus Solutions

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */
 
package java.io;

/**
 * @author Per Bothner <bothner@cygnus.com>
 * @date April 21, 1998.  
 */
/* Written using "Java Class Libraries", 2nd edition, plus online
 * API docs for JDK 1.2 beta from http://www.javasoft.com.
 * Status:  Believed complete and correct.
 */

public abstract class Reader
{
  protected Object lock;

  protected Reader()
  {
    this.lock = this;
  }

  protected Reader(Object lock)
  {
    this.lock = lock;
  }

  abstract public int read(char buf[], int offset, int count)
    throws IOException;

  public int read(char buf[]) throws IOException
  {
    return read(buf, 0, buf.length);
  }

  public int read() throws IOException
  {
    char[] buf = new char[1];
    int count = read(buf, 0, 1);
    return count > 0 ? buf[0] : -1;
  }

  abstract public void close() throws IOException;

  public boolean markSupported()
  {
    return false;
  }

  public void mark(int readLimit) throws IOException
  {
    throw new IOException("mark not supported");
  }

  public void reset() throws IOException
  {
    throw new IOException("reset not supported");
  }

  public boolean ready() throws IOException
  {
    return false;
  }

  public long skip(long count) throws IOException
  {
    if (count <= 0)
      return 0;
    int bsize = count > 1024 ? 1024 : (int) count;
    char[] buffer = new char[bsize];
    long todo = count;
    while (todo > 0)
      {
	int skipped = read(buffer, 0, bsize > todo ? (int) todo : bsize);
	if (skipped <= 0)
	  break;
	todo -= skipped;
      }
    return count - todo;
  }
}
