public class StrBuffer
{
  private static final int DEFAULT_INCREMENT = 100;

  private int nIncrement; // Incremento del buffer
  private byte buffer[];  // Buffer con los bytes de la cadena
  private int count = 0;  // Numero de caracteres en la cadena


  public StrBuffer()
  {
    nIncrement = DEFAULT_INCREMENT;
    buffer = new byte[nIncrement];
  }

  public StrBuffer(int initialSize)
  {
    nIncrement = DEFAULT_INCREMENT;
    buffer = new byte[initialSize];
  }

  public StrBuffer append(String str)
  {
    int len = str.length();
    int newcount = count + len;
    if(newcount > buffer.length) expandCapacity(newcount);
    str.getBytes(0, len, buffer, count);
    count = newcount;
    return this;
  }

  public StrBuffer append(byte car)
  {
    if(count == buffer.length) expandCapacity(count + 1);
    buffer[count++] = car;
    return this;
  }

  public StrBuffer append(int value)
  {
    return append(String.valueOf(value));
  }

  public StrBuffer append(byte str[])
  {
    int len = str.length;
    int newcount = count + len;
    if(newcount > buffer.length) expandCapacity(newcount);
    System.arraycopy(str, 0, buffer, count, len);
    count = newcount;
    return this;
  }

  public StrBuffer copy(String str)
  {
    count = 0;
    return append(str);
  }

  public StrBuffer copy(byte car)
  {
    count = 0;
    return append(car);
  }

  public StrBuffer copy(int value)
  {
    count = 0;
    return append(value);
  }

  public StrBuffer copy(byte str[])
  {
    count = 0;
    return append(str);
  }

  private void expandCapacity(int minimumSize)
  {
    int newSize = buffer.length + nIncrement;
    if(newSize < minimumSize) newSize = minimumSize;
    byte newBuffer[] = new byte[newSize];
    System.arraycopy(buffer, 0, newBuffer, 0, buffer.length);
    buffer = newBuffer;
  }

  public byte[] getBuffer()
  {
    return buffer;
  }

  public void setIncrement(int incr)
  {
    nIncrement = incr;
  }

  public void setLength(int len)
  {
    if(len > buffer.length) expandCapacity(len);
    count = len;
  }

  public int getLength()
  {
    return count;
  }

  public String toString()
  {
    return new String(buffer, 0, count);
  }
}