blob: e34b323cd932e1f5576930da4afe0bf169bec12f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1997, 2008 by ProSyst Software GmbH
* http://www.prosyst.com
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* ProSyst Software GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.util.string;
/**
* Class which stores text in a <code>char</code> array buffer
* and allows inserting, deleting, removing, appending etc.
* actions with the stored text.
*
* @author Pavlin Dobrev
* @author Georgi Andreev
* @version 1.0
*/
public class CharBuffer {
private char value[];
private int cnt;
public CharBuffer() {
this(16);
}
public CharBuffer(int len) {
value = new char[len];
}
public int length() {
return cnt;
}
public void ensureCapacity(int minCapacity) {
if (minCapacity > value.length)
expandCapacity(minCapacity);
}
private void expandCapacity(int minCapacity) {
int capacity = (value.length + 1) * 2;
if (minCapacity > capacity) {
capacity = minCapacity;
}
char newVal[] = new char[capacity];
System.arraycopy(value, 0, newVal, 0, cnt);
value = newVal;
}
public void setLength(int newLen) {
if (newLen > value.length)
expandCapacity(newLen);
if (cnt < newLen) {
for (; cnt < newLen; cnt++) {
value[cnt] = '\0';
}
} else {
cnt = newLen;
}
}
public char charAt(int index) {
if ((index < 0) || (index >= cnt))
throw new StringIndexOutOfBoundsException(index);
return value[index];
}
public void setCharAt(int index, char ch) {
if ((index < 0) || (index >= cnt))
throw new StringIndexOutOfBoundsException(index);
value[index] = ch;
}
public void append(String str) {
if (str == null)
str = String.valueOf(str);
int len = str.length();
int newcnt = cnt + len;
if (newcnt > value.length)
expandCapacity(newcnt);
str.getChars(0, len, value, cnt);
cnt = newcnt;
}
public void append(char str[], int offset, int len) {
int newcnt = cnt + len;
if (newcnt > value.length)
expandCapacity(newcnt);
System.arraycopy(str, offset, value, cnt, len);
cnt = newcnt;
}
public void append(char str[]) {
append(str, 0, str.length);
}
public void append(char c) {
int newcount = cnt + 1;
if (newcount > value.length)
expandCapacity(newcount);
value[cnt++] = c;
}
public String substring(int start, int end) {
return new String(value, start, end - start);
}
public String trim() {
int len = cnt;
int st = 0;
int off = 0;
char[] newVal = value;
while ((st < len) && (newVal[off + st] <= ' '))
st++;
while ((st < len) && (newVal[off + len - 1] <= ' '))
len--;
return ((st > 0) || (len < cnt)) ? substring(st, len) : toString();
}
public boolean equals(int offset, String with) {
int len = with.length();
if (offset >= cnt || offset + len != cnt)
return false;
for (int i = offset; i < cnt; i++) {
if (value[i] != with.charAt(i - offset))
return false;
}
return true;
}
public void getChars(int srcStart, int srcEnd, char dest[], int destStart) {
if ((srcStart < 0) || (srcStart >= cnt))
throw new StringIndexOutOfBoundsException(srcStart);
if ((srcEnd < 0) || (srcEnd > cnt))
throw new StringIndexOutOfBoundsException(srcEnd);
if (srcStart < srcEnd)
System.arraycopy(value, srcStart, dest, destStart, srcEnd - srcStart);
else if (srcStart > srcEnd)
throw new StringIndexOutOfBoundsException(srcEnd - srcStart);
}
public String toString() {
return new String(value, 0, cnt);
}
public char[] getValue() {
char[] retVal;
retVal = new char[cnt];
System.arraycopy(value, 0, retVal, 0, cnt);
return retVal;
}
}