package uk.co.mmscomputing.device.capi;
public class StructOut{
static public final StructOut empty=new StructOut(0);
private byte[] data;
private int index;
public StructOut(int len){
data=new byte[len];
index=0;
}
public StructOut(byte[] buf){
data=buf;
index=buf.length;
}
public StructOut(String str){
data=str.getBytes();
index=str.length();
}
public byte[] getBytes(){return data;}
public int getIndex(){return index;}
public void setIndex(int i){index=i;}
public int getLength(){ // length of a struct (see writeStruct)
return(index<255)?index+1:index+3;
}
public void writeByte(int i){
try{
data[index++]=(byte)i;
}catch(IndexOutOfBoundsException ioobe){ // This shouldn't happen. Programming error.
System.out.println(getClass().getName()+".writeByte:\n\tINTERNAL ERROR !!! Please send error log to mmsc.\n\t"+ioobe);
System.err.println(getClass().getName()+".writeByte:\n\tINTERNAL ERROR !!! Please send error log to mmsc.\n\t"+ioobe);
ioobe.printStackTrace();
}
}
public void writeWord(int i){
try{
data[index++]=(byte)i; // LSB least significant byte
data[index++]=(byte)(i>>8); // MSB most significant byte
}catch(IndexOutOfBoundsException ioobe){ // This shouldn't happen. Programming error.
System.out.println(getClass().getName()+".writeWord:\n\tINTERNAL ERROR !!! Please send error log to mmsc.\n\t"+ioobe);
System.err.println(getClass().getName()+".writeWord:\n\tINTERNAL ERROR !!! Please send error log to mmsc.\n\t"+ioobe);
ioobe.printStackTrace();
}
}
public void writeDWord(int i){
try{
data[index++]=(byte)i; // LSB least significant byte
data[index++]=(byte)(i>>8);
data[index++]=(byte)(i>>16);
data[index++]=(byte)(i>>24); // MSB most significant byte
}catch(IndexOutOfBoundsException ioobe){ // This shouldn't happen. Programming error.
System.out.println(getClass().getName()+".writeWord:\n\tINTERNAL ERROR !!! Please send error log to mmsc.\n\t"+ioobe);
System.err.println(getClass().getName()+".writeWord:\n\tINTERNAL ERROR !!! Please send error log to mmsc.\n\t"+ioobe);
ioobe.printStackTrace();
}
}
public void writeQWord(long l){
writeDWord((int)(l&0x00000000FFFFFFFFL));
writeDWord((int)((l>>32)&0x00000000FFFFFFFFL));
}
public void writeData(byte[] src, int off, int len){
try{
System.arraycopy(src,off,data,index,len);index+=len;
}catch(IndexOutOfBoundsException ioobe){ // This shouldn't happen. Programming error.
System.out.println(getClass().getName()+"\n\tINTERNAL ERROR !!! Please send error log to mmsc.\n\t"+ioobe);
System.err.println("buffer.length = "+data.length);
System.err.println("index = "+index);
System.err.println("length = "+len);
System.err.println(getClass().getName()+"\n\tINTERNAL ERROR !!! Please send error log to mmsc.\n\t"+ioobe);
ioobe.printStackTrace();
}
}
public void writeStruct(){
writeByte(0); // empty struct
}
public void writeStruct(StructOut struct){
int len = struct.getBytes().length;
if(len==0){
writeByte(0);
}else{
if(len<255){
writeByte(len);
}else{
writeByte(255); // escape
writeWord(len);
}
writeData(struct.getBytes(),0,len);
}
}
public void dump(){ // print out bytes to command line
System.err.println(getClass().getName()+".dump : ");
for(int i=0;i<index;i++){
int val=data[i]&0x000000FF;
String sval=Integer.toHexString(val);
if(sval.length()>2){
sval=sval.substring(sval.length()-2);
}else if(sval.length()<2){
sval="0"+sval;
}
System.err.println("\t["+i+"] = 0x"+sval+" "+val);
}
System.err.println();
}
public void dump(java.io.OutputStream out)throws java.io.IOException{
out.write((getClass().getName()+".dump : \r\n").getBytes());
for(int i=0;i<index;i++){
int val=data[i]&0x000000FF;
String sval=Integer.toHexString(val);
if(sval.length()>2){
sval=sval.substring(sval.length()-2);
}else if(sval.length()<2){
sval="0"+sval;
}
out.write(("\t["+i+"] = 0x"+sval+" "+val+"\r\n").getBytes());
}
out.write('\r');out.write('\n');
}
public String toString(){
return getClass().getName()+"\n";
}
static String[] hexs={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
static public String toString(byte[] data){
int v;
String s="\n";
int i=0;
while(i<data.length){
s+=" ";
s+=hexs[(data[i]>>4)&0x0F];
s+=hexs[(data[i] )&0x0F];
if(((i+1)%8)==0){s+="\n";}
i++;
}
if(((i+1)%8)!=0){s+="\n";}
return s;
}
}