private void initBuffer() {
    CharInfo c;

    {
      c = new CharInfo();
      c.cp = 0;
      c.str = "B3";
      c.ctype = "O";
      c.start = -1;
      c.end = -1;
      buffer[0] = c;

      c = new CharInfo();
      c.cp = 0;
      c.str = "B2";
      c.ctype = "O";
      c.start = -1;
      c.end = -1;
      buffer[1] = c;

      c = new CharInfo();
      c.cp = 0;
      c.str = "B1";
      c.ctype = "O";
      c.start = -1;
      c.end = -1;
      buffer[2] = c;
    }
    end = 3;
    position = 3;
  }
  public CharInfo readChar() throws IOException {
    CharInfo c = new CharInfo();

    if (eos) {
      c.start = -1;
      c.end = -1;
      c.cp = -1;
    } else {
      c.start = reader.getPosition();
      c.cp = reader.read();
      c.end = reader.getPosition();
    }

    if (c.cp < 0) {
      eos = true;
      switch (eosCount) {
        case 0:
          c.str = "E1";
          c.ctype = "O";
          ++eosCount;
          break;
        case 1:
          c.str = "E2";
          c.ctype = "O";
          ++eosCount;
          break;
        case 2:
          c.str = "E3";
          c.ctype = "O";
          ++eosCount;
          break;
        default:
          return null;
      }
    } else {
      c.str = new String(Character.toChars(c.cp));
      c.ctype = getCharType(c.cp);
    }

    return c;
  }