package rdc;
import java.io.*;

public class Buffer implements Constants {
  private byte[] buffer;
  private int size;
  private int cur;
  public Buffer() {
    size = 0;
    cur = 0;
  }
  public void SetPos(int pos) {
    cur = pos;
  }

  public int Read (String fileName) {
    try {
      File file = new File(fileName);
      size = (int) file.length();
      buffer = new byte[size];
      FileInputStream fis = new FileInputStream(file);
      int r = fis.read(buffer, 0, size);
      // e.println("Read " + r + " of " + size + " from " + fileName);
      return r;
    }
    catch (IOException ioe) {
      return -1;
    }
  }

  public String GetString(int num) {
    String tmp = GetStringAt(cur, num);
    cur += num;
    return tmp;
  }

  public String GetStringAt(int pos, int num) {
    byte[] tmp = GetBytesAt(pos, num);
    for ( int i = 0; i < num; i++ ) {
      if ( tmp[i] == 0 ) {
	return new String(tmp, 0, i);
      }
    }
    return new String(tmp, 0, num);
  }

  public int GetByte() {
    int tmp = (int)(buffer[cur++]);
    return tmp;
  }

  public byte[] GetBytes(int num) {
    byte[] tmp = GetBytesAt(cur, num);
    cur += num;
    return tmp;
  }

  public byte[] GetBytesAt(int pos, int num) {
    byte[] tmp = new byte[num];
    for ( int i = 0; i < num; i++, pos++ ) {
      tmp[i] = buffer[pos];
    }
    return tmp;
  }

  public int GetShort() {
    int tmp = GetShortAt(cur);
    cur += 2;
    return tmp;
  }

  public int GetShortAt(int pos) {
    int i1 = buffer[pos++] & 0xff;
    int i2 = buffer[pos++] & 0xff;
    return ( (i1 << 8) + i2);
  }

  public int GetInt() {
    int tmp = GetIntAt(cur);
    return tmp;
  }

  public int GetIntAt(int pos) {
    int i1 = GetShort();
    int i2 = GetShort();
    return ( (i1 << 16) + i2);
  }
  public int GetSize() {
    return size;
  }

  public Rectangle GetRect(Rectangle r) {
    r.xr = GetShort();
    r.yr = GetShort();
    r.wr = GetShort();
    r.hr = GetShort();
    return r;
  }
  
  public Point GetPoint(Point r) {
    r.xr = GetShort();
    r.yr = GetShort();
    return r;
  }

  public String GetQuotedString() {
    String tmp = GetString();
    return Quote(tmp);
  }

  public String GetString() {
    String tmp = GetStringAt(cur);
    cur += tmp.length() + 1;
    return tmp;
  }
  
  public String GetQuotedStringAt(int pos) {
    String tmp = GetStringAt(pos);
    return Quote(tmp);
  }

  public String GetStringAt(int pos) {
    int i = 0;
    for ( i = pos; buffer[i] != 0; i++ );
    String tmp = new String(buffer, pos, i - pos);
    return tmp;
  }
  private String Quote(String s1) {
    byte[] s = s1.getBytes();
    StringBuffer buffer = new StringBuffer();
    buffer.append("\"");
    for (int i = 0; i < s.length; ++i) {
      byte b = s[i];
      if (b >= 0x20 && b < 0x7f) {
	if (b == (byte) '"' || b == (byte) '\\') 
	  { buffer.append('\\');
	  }
	buffer.append((char) b);
      } 
      else if (b == (byte) '\t') {
	buffer.append("\\t");
      } 
      else if (b == (byte) '\n') {
	buffer.append("\\n");
      } 
      else {
	String tmp = "00" + Integer.toOctalString(b & 0xff);
	if ( tmp.equals("00205") ) {
	  buffer.append("...");
	}
	else {
	  buffer.append("\\").append(tmp.substring(tmp.length() - 3));
	}
      }
    }
    buffer.append('"');
    return buffer.toString();
  }
}
      

