CString.java
package eu.javaexperience.nativ.utils;
import eu.javaexperience.nativ.posix.Posix;
/**
*
* */
public class CString implements CharSequence
{
private final long addr;
private final int maxlen;
private int len = -1;
public CString(String str)
{
addr = Posix.jstrcpy(str);
maxlen = Posix.strlen(addr);
}
public CString(int len)
{
addr = Posix.malloc(len);
Posix.setByteAt(addr, (byte)0);
maxlen = len;
}
public CString(String str,int maxlen)
{
this.addr = Posix.jstrcpy(str);
int len = Posix.strlen(this.addr);
this.maxlen = maxlen>len? maxlen:len;
}
public CString(long addr,int maxlen)
{
this.addr = addr;
this.maxlen = maxlen;
}
public void setCharAt(int i,char c)
{
Posix.setByteAt(addr+i, (byte)c);
}
public static CString strClone(long addr,int len)
{
long p = Posix.malloc(len+1);
Posix.cpyrange(p, addr,len);
return new CString(p,len);
}
@Override
public char charAt(int arg0)
{
return (char) (Posix.byteAt(addr)+arg0);
}
public int getMaximalLength()
{
return maxlen;
}
public int setLength(int leng)
{
return len = leng > maxlen?maxlen:leng;
}
@Override
public int length()
{
if(len < 0)
return Posix.strlen(addr);
return len;
}
@Override
public CharSequence subSequence(int arg0, int arg1)
{
//TODO Teszt args?
CString ret = new CString(this.addr+arg0, arg1-arg0);
ret.setLength(arg1-arg0);
return ret;
}
public void free()
{
Posix.free(addr);
}
public String toString()
{
return Posix.getCstrUTF(addr);
}
public static void main(String[] args)
{
CString cs = new CString("Helló Világ");
System.out.println(cs);
}
}