X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FI18N%2FOther%2FCP1258.cs;h=e56c46733145cc86b55ec995382457ed8a43a202;hb=bc9d5d113ab7064fc199a2f430751643466cb477;hp=79b5fb3b953b97fb404606b8f7011a22f0655bc3;hpb=fc4b07f20f9e79fe99d4b520bb5ff8b5e80b10f6;p=mono.git diff --git a/mcs/class/I18N/Other/CP1258.cs b/mcs/class/I18N/Other/CP1258.cs index 79b5fb3b953..e56c4673314 100644 --- a/mcs/class/I18N/Other/CP1258.cs +++ b/mcs/class/I18N/Other/CP1258.cs @@ -24,6 +24,9 @@ // Generated from "ibm-5354.ucm". +// WARNING: Modifying this file directly might be a bad idea. +// You should edit the code generator tools/ucm2cp.c instead for your changes +// to appear in all relevant classes. namespace I18N.Other { @@ -86,18 +89,63 @@ public class CP1258 : ByteEncoding '\u00FC', '\u01B0', '\u20AB', '\u00FF', }; + // Get the number of bytes needed to encode a character buffer. + public unsafe override int GetByteCountImpl (char* chars, int count) + { + if (this.EncoderFallback != null) { + //Calculate byte count by actually doing encoding and discarding the data. + return GetBytesImpl(chars, count, null, 0); + } + else + + { + return count; + } + } + + // Get the number of bytes needed to encode a character buffer. + public override int GetByteCount (String s) + { + if (this.EncoderFallback != null) + { + //Calculate byte count by actually doing encoding and discarding the data. + unsafe + { + fixed (char *s_ptr = s) + { + return GetBytesImpl(s_ptr, s.Length, null, 0); + } + } + } + else + { + //byte count equals character count because no EncoderFallback set + return s.Length; + } + } + + //ToBytes is just an alias for GetBytesImpl, but doesn't return byte count protected unsafe override void ToBytes(char* chars, int charCount, byte* bytes, int byteCount) + { + //Calling ToBytes with null destination buffer doesn't make any sense + if (bytes == null) + throw new ArgumentNullException("bytes"); + GetBytesImpl(chars, charCount, bytes, byteCount); + } + + public unsafe override int GetBytesImpl (char* chars, int charCount, + byte* bytes, int byteCount) { int ch; int charIndex = 0; int byteIndex = 0; -#if NET_2_0 EncoderFallbackBuffer buffer = null; -#endif - while(charCount > 0) + while (charCount > 0) { - ch = (int)(chars[charIndex++]); + ch = (int)(chars[charIndex]); + charIndex++; + charCount--; if(ch >= 128) switch(ch) { case 0x0081: @@ -232,20 +280,24 @@ public class CP1258 : ByteEncoding default: { if(ch >= 0xFF01 && ch <= 0xFF5E) + { ch -= 0xFEE0; + } else -#if NET_2_0 - HandleFallback (ref buffer, chars, ref charIndex, ref charCount, bytes, ref byteIndex, ref byteCount); -#else - ch = 0x3F; -#endif + { + HandleFallback (ref buffer, chars, ref charIndex, ref charCount, bytes, ref byteIndex, ref byteCount); + continue; + } } break; } - bytes[byteIndex++] = (byte)ch; - --charCount; - --byteCount; + //Write encoded byte to buffer, if buffer is defined and fallback was not used + if (bytes != null) + bytes[byteIndex] = (byte)ch; + byteIndex++; + byteCount--; } + return byteIndex; } /* @@ -390,9 +442,13 @@ public class CP1258 : ByteEncoding default: { if(ch >= 0xFF01 && ch <= 0xFF5E) + { ch -= 0xFEE0; + } else + { ch = 0x3F; + } } break; }