package uk.co.mmscomputing.device.capi;
public class Rider{
private int[] stack = new int[32];
private byte[] data;
private int off,sp,index;
public Rider(){
this.data = new byte[0];
this.off = 0;
this.sp = 0;
this.stack[sp] = 0;
this.index = 0;
}
public void set(byte[] data,int off,int len){
this.data = data;
this.off = off;
this.sp = 0;
this.stack[sp] = len;
this.index = 0;
}
public void set(byte[] data){
set(data,0,(data[0]&0x00FF)|((data[1]&0x00FF)<<8));
}
public Rider(byte[] data){
set(data,0,data.length);
}
public Rider(byte[] data,int off,int len){
set(data,off,len);
}
public void setLength(){ // read and set length of content
int len=read(); // read 1 byte length
stack[++sp]=len+index; // set len to current byte position plus value of byte read
}
// public int getLength(){return stack[sp];}
/*
public void setStructLength(){ // read and set length of struct content; return old length
int len=read(); // read 1 byte length
if(len==255){len=readWord();} // if escape code read 2 byte length
stack[++sp]=len;
}
*/
public void skip(int i){
if(stack[sp]<=(index+i)){throw new IndexOutOfBoundsException(""+(index+i));}
index+=i;
}
public void skip(){
index=stack[sp--];
}
public int available(){
return stack[sp]-index;
}
public void reset(){sp=0;index=0;}
public void structBegin(){ // read and set length of struct content
int len=read(); // read 1 byte length
if(len==255){len=readWord();} // if escape code read 2 byte length
stack[++sp]=len+index;
}
public void structEnd(){
index=stack[sp--];
}
public int read(){
if(index<stack[sp]){ // len can be smaller than data.length
int b = data[off+index]&0x00FF;
index++;
return b;
}
throw new IndexOutOfBoundsException();
}
/*
public int readByte(){
if(index<stack[sp]){ // len can be smaller than data.length
int b = data[off+index]&0x00FF;
index++;
return b;
}
throw new IndexOutOfBoundsException();
}
*/
public int readWord() {
return read()|(read()<<8);
}
public int readDWord(){
return read()|(read()<<8)|(read()<<16)|(read()<<24);
}
public long readQWord(){
return read()|(read()<<8)|(read()<<16)|(read()<<24)|(read()<<32)|(read()<<40)|(read()<<48)|(read()<<56);
}
public String readString(){
String s = new String(data,off+index,stack[sp]-index);
index=stack[sp];
return s;
}
public byte[] getBytes(){
byte[] buf=new byte[stack[sp]-index];
System.arraycopy(data,off+index,buf,0,buf.length);
return buf;
}
public byte[] readStruct(){
structBegin();
byte[] buf=getBytes();
structEnd();
return buf;
}
static String[] hexs={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
public String toString(){
String s="Rider data - \n index = "+index+" sp = "+stack[sp]+"\n";
int v;
int i = index;
while(i<stack[sp]){
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;
}
}