Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / Text / EncoderReplacementFallback.cs / 1 / EncoderReplacementFallback.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// EncoderReplacementFallback.cs
//
namespace System.Text
{
using System;
[Serializable]
public sealed class EncoderReplacementFallback : EncoderFallback
{
// Our variables
private String strDefault;
// Construction. Default replacement fallback uses no best fit and ? replacement string
public EncoderReplacementFallback() : this("?")
{
}
public EncoderReplacementFallback(String replacement)
{
// Must not be null
if (replacement == null)
throw new ArgumentNullException("replacement");
// Make sure it doesn't have bad surrogate pairs
bool bFoundHigh=false;
for (int i = 0; i < replacement.Length; i++)
{
// Found a surrogate?
if (Char.IsSurrogate(replacement,i))
{
// High or Low?
if (Char.IsHighSurrogate(replacement, i))
{
// if already had a high one, stop
if (bFoundHigh)
break; // break & throw at the bFoundHIgh below
bFoundHigh = true;
}
else
{
// Low, did we have a high?
if (!bFoundHigh)
{
// Didn't have one, make if fail when we stop
bFoundHigh = true;
break;
}
// Clear flag
bFoundHigh = false;
}
}
// If last was high we're in trouble (not surrogate so not low surrogate, so break)
else if (bFoundHigh)
break;
}
if (bFoundHigh)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidCharSequenceNoIndex", "replacement"));
strDefault = replacement;
}
public String DefaultString
{
get
{
return strDefault;
}
}
public override EncoderFallbackBuffer CreateFallbackBuffer()
{
return new EncoderReplacementFallbackBuffer(this);
}
// Maximum number of characters that this instance of this fallback could return
public override int MaxCharCount
{
get
{
return strDefault.Length;
}
}
public override bool Equals(Object value)
{
EncoderReplacementFallback that = value as EncoderReplacementFallback;
if (that != null)
{
return (this.strDefault == that.strDefault);
}
return (false);
}
public override int GetHashCode()
{
return strDefault.GetHashCode();
}
}
public sealed class EncoderReplacementFallbackBuffer : EncoderFallbackBuffer
{
// Store our default string
private String strDefault;
int fallbackCount = -1;
int fallbackIndex = -1;
// Construction
public EncoderReplacementFallbackBuffer(EncoderReplacementFallback fallback)
{
// 2X in case we're a surrogate pair
this.strDefault = fallback.DefaultString + fallback.DefaultString;
}
// Fallback Methods
public override bool Fallback(char charUnknown, int index)
{
// If we had a buffer already we're being recursive, throw, it's probably at the suspect
// character in our array.
if (fallbackCount >= 1)
{
// If we're recursive we may still have something in our buffer that makes this a surrogate
if (char.IsHighSurrogate(charUnknown) && fallbackCount >= 0 &&
char.IsLowSurrogate(strDefault[fallbackIndex+1]))
ThrowLastCharRecursive(Char.ConvertToUtf32(charUnknown, strDefault[fallbackIndex+1]));
// Nope, just one character
ThrowLastCharRecursive(unchecked((int)charUnknown));
}
// Go ahead and get our fallback
// Divide by 2 because we aren't a surrogate pair
fallbackCount = strDefault.Length/2;
fallbackIndex = -1;
return fallbackCount != 0;
}
public override bool Fallback(char charUnknownHigh, char charUnknownLow, int index)
{
// Double check input surrogate pair
if (!Char.IsHighSurrogate(charUnknownHigh))
throw new ArgumentOutOfRangeException("charUnknownHigh",
Environment.GetResourceString("ArgumentOutOfRange_Range",
0xD800, 0xDBFF));
if (!Char.IsLowSurrogate(charUnknownLow))
throw new ArgumentOutOfRangeException("CharUnknownLow",
Environment.GetResourceString("ArgumentOutOfRange_Range",
0xDC00, 0xDFFF));
// If we had a buffer already we're being recursive, throw, it's probably at the suspect
// character in our array.
if (fallbackCount >= 1)
ThrowLastCharRecursive(Char.ConvertToUtf32(charUnknownHigh, charUnknownLow));
// Go ahead and get our fallback
fallbackCount = strDefault.Length;
fallbackIndex = -1;
return fallbackCount != 0;
}
public override char GetNextChar()
{
// We want it to get < 0 because == 0 means that the current/last character is a fallback
// and we need to detect recursion. We could have a flag but we already have this counter.
fallbackCount--;
fallbackIndex++;
// Do we have anything left? 0 is now last fallback char, negative is nothing left
if (fallbackCount < 0)
return (char)0;
// Need to get it out of the buffer.
BCLDebug.Assert(fallbackIndex < strDefault.Length && fallbackIndex >= 0,
"Index exceeds buffer range");
return strDefault[fallbackIndex];
}
public override bool MovePrevious()
{
// Back up one, only if we just processed the last character (or earlier)
if (fallbackCount >= -1 && fallbackIndex >= 0)
{
fallbackIndex--;
fallbackCount++;
return true;
}
// Return false 'cause we couldn't do it.
return false;
}
// How many characters left to output?
public override int Remaining
{
get
{
// Our count is 0 for 1 character left.
return (fallbackCount < 0) ? 0 : fallbackCount;
}
}
// Clear the buffer
public override unsafe void Reset()
{
fallbackCount = -1;
fallbackIndex = 0;
charStart = null;
bFallingBack = false;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// EncoderReplacementFallback.cs
//
namespace System.Text
{
using System;
[Serializable]
public sealed class EncoderReplacementFallback : EncoderFallback
{
// Our variables
private String strDefault;
// Construction. Default replacement fallback uses no best fit and ? replacement string
public EncoderReplacementFallback() : this("?")
{
}
public EncoderReplacementFallback(String replacement)
{
// Must not be null
if (replacement == null)
throw new ArgumentNullException("replacement");
// Make sure it doesn't have bad surrogate pairs
bool bFoundHigh=false;
for (int i = 0; i < replacement.Length; i++)
{
// Found a surrogate?
if (Char.IsSurrogate(replacement,i))
{
// High or Low?
if (Char.IsHighSurrogate(replacement, i))
{
// if already had a high one, stop
if (bFoundHigh)
break; // break & throw at the bFoundHIgh below
bFoundHigh = true;
}
else
{
// Low, did we have a high?
if (!bFoundHigh)
{
// Didn't have one, make if fail when we stop
bFoundHigh = true;
break;
}
// Clear flag
bFoundHigh = false;
}
}
// If last was high we're in trouble (not surrogate so not low surrogate, so break)
else if (bFoundHigh)
break;
}
if (bFoundHigh)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidCharSequenceNoIndex", "replacement"));
strDefault = replacement;
}
public String DefaultString
{
get
{
return strDefault;
}
}
public override EncoderFallbackBuffer CreateFallbackBuffer()
{
return new EncoderReplacementFallbackBuffer(this);
}
// Maximum number of characters that this instance of this fallback could return
public override int MaxCharCount
{
get
{
return strDefault.Length;
}
}
public override bool Equals(Object value)
{
EncoderReplacementFallback that = value as EncoderReplacementFallback;
if (that != null)
{
return (this.strDefault == that.strDefault);
}
return (false);
}
public override int GetHashCode()
{
return strDefault.GetHashCode();
}
}
public sealed class EncoderReplacementFallbackBuffer : EncoderFallbackBuffer
{
// Store our default string
private String strDefault;
int fallbackCount = -1;
int fallbackIndex = -1;
// Construction
public EncoderReplacementFallbackBuffer(EncoderReplacementFallback fallback)
{
// 2X in case we're a surrogate pair
this.strDefault = fallback.DefaultString + fallback.DefaultString;
}
// Fallback Methods
public override bool Fallback(char charUnknown, int index)
{
// If we had a buffer already we're being recursive, throw, it's probably at the suspect
// character in our array.
if (fallbackCount >= 1)
{
// If we're recursive we may still have something in our buffer that makes this a surrogate
if (char.IsHighSurrogate(charUnknown) && fallbackCount >= 0 &&
char.IsLowSurrogate(strDefault[fallbackIndex+1]))
ThrowLastCharRecursive(Char.ConvertToUtf32(charUnknown, strDefault[fallbackIndex+1]));
// Nope, just one character
ThrowLastCharRecursive(unchecked((int)charUnknown));
}
// Go ahead and get our fallback
// Divide by 2 because we aren't a surrogate pair
fallbackCount = strDefault.Length/2;
fallbackIndex = -1;
return fallbackCount != 0;
}
public override bool Fallback(char charUnknownHigh, char charUnknownLow, int index)
{
// Double check input surrogate pair
if (!Char.IsHighSurrogate(charUnknownHigh))
throw new ArgumentOutOfRangeException("charUnknownHigh",
Environment.GetResourceString("ArgumentOutOfRange_Range",
0xD800, 0xDBFF));
if (!Char.IsLowSurrogate(charUnknownLow))
throw new ArgumentOutOfRangeException("CharUnknownLow",
Environment.GetResourceString("ArgumentOutOfRange_Range",
0xDC00, 0xDFFF));
// If we had a buffer already we're being recursive, throw, it's probably at the suspect
// character in our array.
if (fallbackCount >= 1)
ThrowLastCharRecursive(Char.ConvertToUtf32(charUnknownHigh, charUnknownLow));
// Go ahead and get our fallback
fallbackCount = strDefault.Length;
fallbackIndex = -1;
return fallbackCount != 0;
}
public override char GetNextChar()
{
// We want it to get < 0 because == 0 means that the current/last character is a fallback
// and we need to detect recursion. We could have a flag but we already have this counter.
fallbackCount--;
fallbackIndex++;
// Do we have anything left? 0 is now last fallback char, negative is nothing left
if (fallbackCount < 0)
return (char)0;
// Need to get it out of the buffer.
BCLDebug.Assert(fallbackIndex < strDefault.Length && fallbackIndex >= 0,
"Index exceeds buffer range");
return strDefault[fallbackIndex];
}
public override bool MovePrevious()
{
// Back up one, only if we just processed the last character (or earlier)
if (fallbackCount >= -1 && fallbackIndex >= 0)
{
fallbackIndex--;
fallbackCount++;
return true;
}
// Return false 'cause we couldn't do it.
return false;
}
// How many characters left to output?
public override int Remaining
{
get
{
// Our count is 0 for 1 character left.
return (fallbackCount < 0) ? 0 : fallbackCount;
}
}
// Clear the buffer
public override unsafe void Reset()
{
fallbackCount = -1;
fallbackIndex = 0;
charStart = null;
bFallingBack = false;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ClientSettingsStore.cs
- Label.cs
- IsolatedStorageFilePermission.cs
- HistoryEventArgs.cs
- Helper.cs
- Range.cs
- DataBinder.cs
- DataColumnPropertyDescriptor.cs
- _NegotiateClient.cs
- SAPICategories.cs
- PopupControlService.cs
- GridViewRow.cs
- PersonalizationEntry.cs
- StrokeNodeData.cs
- DependencyPropertyConverter.cs
- URLString.cs
- EntitySetBase.cs
- SharedDp.cs
- WebSysDisplayNameAttribute.cs
- DbConnectionPool.cs
- BooleanToVisibilityConverter.cs
- ValidatorCompatibilityHelper.cs
- GacUtil.cs
- EdmComplexPropertyAttribute.cs
- Permission.cs
- FontStretchConverter.cs
- IisTraceWebEventProvider.cs
- ListViewGroupItemCollection.cs
- EditorPartCollection.cs
- ControlTemplate.cs
- ButtonDesigner.cs
- PartitionedDataSource.cs
- FontDriver.cs
- BaseHashHelper.cs
- DynamicILGenerator.cs
- ExceptionUtil.cs
- OutputScopeManager.cs
- GridViewDeleteEventArgs.cs
- Decorator.cs
- ObjectHandle.cs
- SourceFileBuildProvider.cs
- TemplateInstanceAttribute.cs
- ItemsChangedEventArgs.cs
- SliderAutomationPeer.cs
- Block.cs
- DetailsViewInsertedEventArgs.cs
- ByeOperationCD1AsyncResult.cs
- EmbossBitmapEffect.cs
- CollectionBuilder.cs
- ColumnMapVisitor.cs
- TextAutomationPeer.cs
- HostingEnvironmentWrapper.cs
- TTSEngineTypes.cs
- PropVariant.cs
- CompositeKey.cs
- DataGridViewRowHeightInfoPushedEventArgs.cs
- HandlerFactoryCache.cs
- prompt.cs
- MsmqElementBase.cs
- ProgressBarHighlightConverter.cs
- CompilerScope.Storage.cs
- TcpWorkerProcess.cs
- ConstructorNeedsTagAttribute.cs
- ServiceProviders.cs
- SystemUnicastIPAddressInformation.cs
- storepermissionattribute.cs
- SurrogateSelector.cs
- AnimationClockResource.cs
- XmlEncodedRawTextWriter.cs
- SslStream.cs
- LinearKeyFrames.cs
- ProjectionQueryOptionExpression.cs
- TreeViewImageIndexConverter.cs
- metadatamappinghashervisitor.cs
- MailHeaderInfo.cs
- ToolStripItemClickedEventArgs.cs
- CodeExpressionCollection.cs
- WebPartZoneBase.cs
- DateBoldEvent.cs
- ToolStripContainerDesigner.cs
- DesignerVerbCollection.cs
- SslStream.cs
- NeutralResourcesLanguageAttribute.cs
- httpserverutility.cs
- SecurityToken.cs
- StrongName.cs
- ConfigurationErrorsException.cs
- DefaultParameterValueAttribute.cs
- WeakEventManager.cs
- coordinator.cs
- DataGridViewTextBoxColumn.cs
- ResourceSet.cs
- SecureStringHasher.cs
- StylusDevice.cs
- WebBrowserPermission.cs
- SmiContextFactory.cs
- ThumbAutomationPeer.cs
- PeerReferralPolicy.cs
- CancelEventArgs.cs
- LocalizationCodeDomSerializer.cs