public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if((stream)==null)throw new ArgumentNullException("stream");
     if((error)==null)throw new ArgumentNullException("error");
     if((array)==null)throw new ArgumentNullException("array");
     if((offset)<0)throw new ArgumentOutOfRangeException("offset"+" not greater or equal to "+"0"+" ("+Convert.ToString(offset,CultureInfo.InvariantCulture)+")");
     if((length)<0)throw new ArgumentOutOfRangeException("length"+" not greater or equal to "+"0"+" ("+Convert.ToString(length,CultureInfo.InvariantCulture)+")");
     if((offset+length)>array.Length)throw new ArgumentOutOfRangeException("offset+length"+" not less or equal to "+Convert.ToString(array.Length,CultureInfo.InvariantCulture)+" ("+Convert.ToString(offset+length,CultureInfo.InvariantCulture)+")");
     for(int i=0;i<length;i++){
       int c=array[offset++];
       if(c<0 || c>=0x110000){
     error.emitEncoderError(stream, c);
       } else if(c<0x80){
     stream.WriteByte(unchecked((byte)((byte)c)));
       } else {
     if(c<minValue){
       error.emitEncoderError(stream, c);
       continue;
     }
     int pointer=-1;
     for(int k=0;k<0x80;k++){
       if(indexes[k]==c){
     pointer=k+0x80;
       }
     }
     if(pointer>=0){
       stream.WriteByte(unchecked((byte)((byte)pointer)));
     } else {
       error.emitEncoderError(stream, c);
     }
       }
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if((stream)==null)throw new ArgumentNullException("stream");
     if((error)==null)throw new ArgumentNullException("error");
     if((array)==null)throw new ArgumentNullException("array");
     if((offset)<0)throw new ArgumentOutOfRangeException("offset"+" not greater or equal to "+"0"+" ("+Convert.ToString(offset,CultureInfo.InvariantCulture)+")");
     if((length)<0)throw new ArgumentOutOfRangeException("length"+" not greater or equal to "+"0"+" ("+Convert.ToString(length,CultureInfo.InvariantCulture)+")");
     if((offset+length)>array.Length)throw new ArgumentOutOfRangeException("offset+length"+" not less or equal to "+Convert.ToString(array.Length,CultureInfo.InvariantCulture)+" ("+Convert.ToString(offset+length,CultureInfo.InvariantCulture)+")");
     for(int i=0;i<length;i++){
       int c=array[offset++];
       if(c<0 || c>=0x110000){
     error.emitEncoderError(stream, c);
       } else if(c<0x80){
     stream.WriteByte(unchecked((byte)((byte)c)));
       } else if(c>=0xF780 && c<=0xF7FF){
     c=(c-0xf780+0x80)&0xFF;
     stream.WriteByte(unchecked((byte)((byte)c)));
       } else {
     error.emitEncoderError(stream, c);
       }
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x110000 || (cp>=0xd800 && cp<=0xdfff)){
     error.emitEncoderError(stream, cp);
     continue;
       }
       int byte1=(cp>>24)&0xFF;
       int byte2=(cp>>16)&0xFF;
       int byte3=(cp>>8)&0xFF;
       int byte4=(cp)&0xFF;
       stream.WriteByte(unchecked((byte)(utf32be ? byte1 : byte4)));
       stream.WriteByte(unchecked((byte)(utf32be ? byte2 : byte3)));
       stream.WriteByte(unchecked((byte)(utf32be ? byte3 : byte2)));
       stream.WriteByte(unchecked((byte)(utf32be ? byte4 : byte1)));
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x110000){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if((cp<=0x7F || cp==0xa5 || cp==0x203e) && state!=0){
     // ASCII state
     state=0;
     stream.WriteByte(unchecked((byte)(0x1b)));
     stream.WriteByte(unchecked((byte)(0x28)));
     stream.WriteByte(unchecked((byte)(0x42)));
       }
       if(cp<=0x7F){
     stream.WriteByte(unchecked((byte)(cp)));
     continue;
       } else if(cp==0xa5){
     stream.WriteByte(unchecked((byte)(0x5c)));
     continue;
       } else if(cp==0x203e){
     stream.WriteByte(unchecked((byte)(0x7e)));
     continue;
       }
       if(cp>=0xFF61 && cp<=0xFF9F && state!=7){
     // Katakana state
     state=7;
     stream.WriteByte(unchecked((byte)(0x1b)));
     stream.WriteByte(unchecked((byte)(0x28)));
     stream.WriteByte(unchecked((byte)(0x49)));
       }
       if(cp>=0xFF61 && cp<=0xFF9F){
     stream.WriteByte(unchecked((byte)(cp-0xFF61+0x21)));
     continue;
       }
       int pointer=JIS0208.codePointToIndex(cp);
       if(pointer<0){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(state!=5){ // lead state
     state=5;
     stream.WriteByte(unchecked((byte)(0x1b)));
     stream.WriteByte(unchecked((byte)(0x24)));
     stream.WriteByte(unchecked((byte)(0x42)));
       }
       int lead=pointer/94+0x21;
       int trail=pointer%94+0x21;
       stream.WriteByte(unchecked((byte)(lead)));
       stream.WriteByte(unchecked((byte)(trail)));
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x110000){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(cp<0x80){
     stream.WriteByte(unchecked((byte)(cp)));
     continue;
       }
       if(cp==0xa5){
     stream.WriteByte(unchecked((byte)(0x5c)));
     continue;
       }
       if(cp==0x203e){
     stream.WriteByte(unchecked((byte)(0x7e)));
     continue;
       }
       if(cp>=0xff61 && cp<=0xff9f){
     stream.WriteByte(unchecked((byte)(cp-0xff61+0xa1)));
     continue;
       }
       int pointer=JIS0208.codePointToIndex(cp);
       if(pointer<0){
     error.emitEncoderError(stream, cp);
     continue;
       }
       int lead=pointer/188;
       lead+=(lead<0x1f) ? 0x81 : 0xc1;
       int trail=pointer%188;
       trail+=(trail<0x3f) ? 0x40 : 0x41;
       stream.WriteByte(unchecked((byte)(lead)));
       stream.WriteByte(unchecked((byte)(trail)));
     }
 }
   public void encode(Stream stream, int[] buffer, int offset, int length,
 IEncodingError error)
   {
       if(stream==null || buffer==null)throw new ArgumentException();
       if(offset<0 || length<0 || offset+length>buffer.Length)
         throw new ArgumentOutOfRangeException();
       for(int i=0;i<buffer.Length;i++){
         int cp=buffer[offset+i];
         if(cp<0 || cp>=0x110000){
       error.emitEncoderError(stream, cp);
       continue;
         }
         if(cp<=0x7F){
       stream.WriteByte(unchecked((byte)(cp)));
       break;
         }
         int pointer=Big5.codePointToIndex(cp);
         if(pointer<0){
       error.emitEncoderError(stream, cp);
       continue;
         }
         int lead=pointer/157+0x81;
         if(lead<0xa1){
       // NOTE: Encoding specification says to
       // "[a]void emitting Hong Kong Supplementary
       // Character Set extensions literally."
       error.emitEncoderError(stream, cp);
       continue;
         }
         int trail=pointer%157;
         if(trail<0x3f) {
       trail+=0x40;
         } else {
       trail+=0x62;
         }
         stream.WriteByte(unchecked((byte)(lead)));
         stream.WriteByte(unchecked((byte)(trail)));
       }
   }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x110000){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(cp<=0x7f){
     stream.WriteByte(unchecked((byte)(cp)));
       } else {
     int pointer=Korean.codePointToIndex(cp);
     if(pointer<0){
       error.emitEncoderError(stream, cp);
       continue;
     }
     if(pointer<(26+26+126)*(0xc7-0x81)){
       int lead=pointer/(26+26+126)+0x81;
       int trail=pointer%(26+26+126);
       int o=0x4d;
       if(trail<26) {
     o=0x41;
       } else if(trail<26+26) {
     o=0x47;
       }
       trail+=o;
       stream.WriteByte(unchecked((byte)(lead)));
       stream.WriteByte(unchecked((byte)(trail)));
     } else {
       pointer-=(26+26+126)*(0xc7-0x81);
       int lead=pointer/94+0xc7;
       int trail=pointer%94+0xa1;
       stream.WriteByte(unchecked((byte)(lead)));
       stream.WriteByte(unchecked((byte)(trail)));
     }
       }
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x110000){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(!initialization){
     initialization=true;
     stream.WriteByte(unchecked((byte)(0x1b)));
     stream.WriteByte(unchecked((byte)(0x24)));
     stream.WriteByte(unchecked((byte)(0x29)));
     stream.WriteByte(unchecked((byte)(0x43)));
       }
       if(state!=0 && cp<=0x7F){
     state=0;
     stream.WriteByte(unchecked((byte)(0x0F)));
       }
       if(cp<=0x7F){
     stream.WriteByte(unchecked((byte)(cp)));
     continue;
       }
       int pointer=Korean.codePointToIndex(cp);
       if(pointer<0){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(state!=5){
     state=5;
     stream.WriteByte(unchecked((byte)(0x0e)));
       }
       if(pointer<(26+26+126)*(0xc7-0x81)){
     int lead=pointer/(26+26+126)+1;
     int trail=pointer%(26+26+126)-26-26+1;
     if(lead<0x21 || trail<0x21){
       error.emitEncoderError(stream, cp);
       continue;
     }
     stream.WriteByte(unchecked((byte)(lead)));
     stream.WriteByte(unchecked((byte)(trail)));
       } else {
     pointer-=(26+26+126)*(0xc7-0x81);
     int lead=pointer/94+0x47;
     int trail=pointer%94+0x21;
     stream.WriteByte(unchecked((byte)(lead)));
     stream.WriteByte(unchecked((byte)(trail)));
       }
     }
     if(state!=0 && length>0){
       state=0;
       stream.WriteByte(unchecked((byte)(0x0F)));
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x110000 || (cp>=0xd800 && cp<=0xdfff)){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(cp<=0xFFFF){
     int b1=(cp>>8)&0xFF;
     int b2=(cp)&0xFF;
     stream.WriteByte(unchecked((byte)(utf16be ? b1 : b2)));
     stream.WriteByte(unchecked((byte)(utf16be ? b2 : b1)));
       } else {
     cp-=0x10000;
     int lead=cp/0x400+0xd800;
     int trail=cp%0x400+0xdc00;
     int b1=(lead>>8)&0xFF;
     int b2=(lead)&0xFF;
     stream.WriteByte(unchecked((byte)(utf16be ? b1 : b2)));
     stream.WriteByte(unchecked((byte)(utf16be ? b2 : b1)));
     b1=(trail>>8)&0xFF;
     b2=(trail)&0xFF;
     stream.WriteByte(unchecked((byte)(utf16be ? b1 : b2)));
     stream.WriteByte(unchecked((byte)(utf16be ? b2 : b1)));
       }
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x10000){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(cp<=0x7F){
     stream.WriteByte(unchecked((byte)(cp)));
       } else if(cp==0xA5){
     stream.WriteByte(unchecked((byte)(0x5c)));
       } else if(cp==0x203E){
     stream.WriteByte(unchecked((byte)(0x7E)));
       } else {
     int index=JIS0208.codePointToIndex(cp);
     if(index<0){
       error.emitEncoderError(stream, cp);
       continue;
     }
     stream.WriteByte(unchecked((byte)(index/94+0xa1)));
     stream.WriteByte(unchecked((byte)(index%94+0xa1)));
       }
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x10000 || (cp>=0xd800 && cp<=0xdfff)){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(cp<=0x7F){
     stream.WriteByte(unchecked((byte)(cp)));
       } else if(cp<=0x7FF){
     stream.WriteByte(unchecked((byte)((0xC0|((cp>>6)))&0x1F)));
     stream.WriteByte(unchecked((byte)((0x80|(cp   &0x3F)))));
       } else if(cp<=0xFFFF){
     stream.WriteByte(unchecked((byte)((0xE0|((cp>>12)))&0x0F)));
     stream.WriteByte(unchecked((byte)((0x80|((cp>>6 )))&0x3F)));
     stream.WriteByte(unchecked((byte)((0x80|(cp      &0x3F)))));
       } else {
     stream.WriteByte(unchecked((byte)((0xF0|((cp>>18)))&0x07)));
     stream.WriteByte(unchecked((byte)((0x80|((cp>>12)))&0x3F)));
     stream.WriteByte(unchecked((byte)((0x80|((cp>>6 )))&0x3F)));
     stream.WriteByte(unchecked((byte)((0x80|(cp      &0x3F)))));
       }
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x110000){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(cp<=0x7F && flag){
     flag=false;
     stream.WriteByte(unchecked((byte)(0x7E)));
     stream.WriteByte(unchecked((byte)(0x7D)));
       }
       if(cp==0x7E){
     stream.WriteByte(unchecked((byte)(0x7E)));
     stream.WriteByte(unchecked((byte)(0x7E)));
       }
       if(cp<=0x7F){
     stream.WriteByte(unchecked((byte)(cp)));
     break;
       }
       int pointer=GBK.codePointToIndex(cp);
       if(pointer<0){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(!flag){
     flag=true;
     stream.WriteByte(unchecked((byte)(0x7E)));
     stream.WriteByte(unchecked((byte)(0x7B)));
       }
       int lead=pointer/190+1;
       int trail=pointer%190-0x3f;
       if(lead<0x21 || trail<0x21){
     error.emitEncoderError(stream, cp);
     continue;
       }
       stream.WriteByte(unchecked((byte)(lead)));
       stream.WriteByte(unchecked((byte)(trail)));
     }
 }
 public void encode(Stream stream, int[] array, int offset, int length, IEncodingError error)
 {
     if(stream==null || array==null)throw new ArgumentException();
     if(offset<0 || length<0 || offset+length>array.Length)
       throw new ArgumentOutOfRangeException();
     for(int i=0;i<array.Length;i++){
       int cp=array[offset+i];
       if(cp<0 || cp>=0x110000){
     error.emitEncoderError(stream, cp);
     continue;
       }
       if(cp<0x7F){
     stream.WriteByte(unchecked((byte)((byte)cp)));
       } else {
     int pointer=GBK.codePointToIndex(cp);
     if(pointer>=0){
       int lead=pointer/190+0x81;
       int trail=pointer%190;
       trail+=(trail<0x3F) ? 0x40 : 0x41;
       stream.WriteByte(unchecked((byte)(lead)));
       stream.WriteByte(unchecked((byte)(trail)));
       continue;
     }
     if(!gb18030){
       error.emitEncoderError(stream, cp);
       continue;
     }
     pointer=GB18030Pointer(cp);
     if(pointer<0){
       error.emitEncoderError(stream, cp);
       continue;
     }
     int b1=pointer/10/126/10;
     pointer-=b1*10*126*10;
     int b2=pointer/10/126;
     pointer-=b2*10*126;
     int b3=pointer/10;
     int b4=pointer-b3*10;
     stream.WriteByte(unchecked((byte)(b1+0x81)));
     stream.WriteByte(unchecked((byte)(b2+0x30)));
     stream.WriteByte(unchecked((byte)(b3+0x81)));
     stream.WriteByte(unchecked((byte)(b4+0x30)));
       }
     }
 }