Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / XmlUtils / System / Xml / Xsl / Xslt / CompilerScopeManager.cs / 1 / CompilerScopeManager.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System.Collections;
using System.Diagnostics;
using System.Xml.Xsl.Qil;
namespace System.Xml.Xsl.Xslt {
// Compiler scope manager keeps track of
// Variable declarations
// Namespace declarations
// Extension and excluded namespaces
internal sealed class CompilerScopeManager : IEnumerable
where V : class
{
public struct ScopeRecord {
public int scopeCount;
public string ncName; // local-name for variable, prefix for namespace, null for extension or excluded namespace
public string nsUri; // namespace uri
public V value; // value for variable, null for namespace
// Exactly one of these three properties is true for every given record
public bool IsVariable { get { return value != default(V); } }
public bool IsNamespace { get { return value == default(V) && ncName != null; } }
public bool IsExNamespace { get { return value == default(V) && ncName == null; } }
}
// Number of predefined records minus one
private const int LastPredefRecord = 0;
private ScopeRecord[] records = new ScopeRecord[32];
private int lastRecord = 0;
// This is cash of records[lastRecord].scopeCount field;
// most often we will have PushScope()/PopScope pare over the same record.
// It has sence to avoid adresing this field through array access.
private int lastScopes = 0;
public CompilerScopeManager() {
Reset();
}
private void Reset() {
// The prefix 'xml' is by definition bound to the namespace name http://www.w3.org/XML/1998/namespace
records[0].ncName = "xml";
records[0].nsUri = XmlReservedNs.NsXml;
lastRecord = LastPredefRecord;
}
public void PushScope() {
lastScopes++;
}
public void PopScope() {
if (0 < lastScopes) {
lastScopes--;
} else {
while (records[--lastRecord].scopeCount == 0) {
}
lastScopes = records[lastRecord].scopeCount;
lastScopes--;
}
}
private void AddRecord(string ncName, string uri, V value) {
Debug.Assert(uri != null);
records[lastRecord].scopeCount = lastScopes;
if (++lastRecord == records.Length) {
ScopeRecord[] newRecords = new ScopeRecord[lastRecord * 2];
Array.Copy(records, 0, newRecords, 0, lastRecord);
records = newRecords;
}
lastScopes = 0;
records[lastRecord].ncName = ncName;
records[lastRecord].nsUri = uri;
records[lastRecord].value = value;
}
// Add namespace declaration (prefix != null) or namespace extension or exclusion (prefix == null) to the current scope.
public void AddNamespace(string prefix, string uri) {
AddRecord(prefix, uri, default(V));
}
// Add variable to the current scope. Returns false in case of duplicates.
public void AddVariable(QilName varName, V value) {
Debug.Assert(varName.LocalName != null && varName.NamespaceUri != null && value != default(V));
AddRecord(varName.LocalName, varName.NamespaceUri, value);
}
// Since the prefix might be redefined in an inner scope, we search in descending order in [to, from]
// If interval is empty (from < to), the function returns null.
private string LookupNamespace(string prefix, int from, int to) {
Debug.Assert(prefix != null);
for (int record = from; to <= record; --record) {
if (
records[record].IsNamespace &&
records[record].ncName == prefix
) {
return records[record].nsUri;
}
}
return null;
}
public string LookupNamespace(string prefix) {
return LookupNamespace(prefix, lastRecord, 0);
}
public bool IsExNamespace(string nsUri) {
Debug.Assert(nsUri != null);
for (int record = lastRecord; 0 <= record; record--) {
if (
records[record].IsExNamespace &&
records[record].nsUri == nsUri
) {
return true;
}
}
return false;
}
private int SearchVariable(string localName, string uri) {
Debug.Assert(localName != null);
for (int record = lastRecord; 0 <= record; --record) {
if (
records[record].IsVariable &&
records[record].ncName == localName &&
records[record].nsUri == uri
) {
return record;
}
}
return -1;
}
public V LookupVariable(string localName, string uri) {
int record = SearchVariable(localName, uri);
return (record < 0) ? default(V) : records[record].value;
}
public bool IsLocalVariable(string localName, string uri) {
int record = SearchVariable(localName, uri);
while (0 <= --record) {
if (records[record].scopeCount != 0) {
return true;
}
}
return false;
}
IEnumerator IEnumerable.GetEnumerator() {
return new NamespaceEnumerator(this);
}
// Class for enumerating namespaces that must be output with literal result element.
private sealed class NamespaceEnumerator : IEnumerator {
CompilerScopeManager scope;
int lastRecord;
int currentRecord;
public NamespaceEnumerator(CompilerScopeManager scope) {
this.scope = scope;
this.lastRecord = scope.lastRecord;
Reset();
}
public void Reset() {
currentRecord = lastRecord + 1;
}
public bool MoveNext() {
while (LastPredefRecord < --currentRecord) {
if (scope.records[currentRecord].IsNamespace) {
// This is a namespace declaration
if (scope.LookupNamespace(scope.records[currentRecord].ncName, lastRecord, currentRecord + 1) == null) {
// Its prefix has not been redefined later in [currentRecord + 1, lastRecord]
return true;
}
}
}
return false;
}
public object Current {
get {
Debug.Assert(LastPredefRecord <= currentRecord && currentRecord <= scope.lastRecord, "MoveNext() either was not called or returned false");
Debug.Assert(scope.records[currentRecord].IsNamespace);
return scope.records[currentRecord];
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System.Collections;
using System.Diagnostics;
using System.Xml.Xsl.Qil;
namespace System.Xml.Xsl.Xslt {
// Compiler scope manager keeps track of
// Variable declarations
// Namespace declarations
// Extension and excluded namespaces
internal sealed class CompilerScopeManager : IEnumerable
where V : class
{
public struct ScopeRecord {
public int scopeCount;
public string ncName; // local-name for variable, prefix for namespace, null for extension or excluded namespace
public string nsUri; // namespace uri
public V value; // value for variable, null for namespace
// Exactly one of these three properties is true for every given record
public bool IsVariable { get { return value != default(V); } }
public bool IsNamespace { get { return value == default(V) && ncName != null; } }
public bool IsExNamespace { get { return value == default(V) && ncName == null; } }
}
// Number of predefined records minus one
private const int LastPredefRecord = 0;
private ScopeRecord[] records = new ScopeRecord[32];
private int lastRecord = 0;
// This is cash of records[lastRecord].scopeCount field;
// most often we will have PushScope()/PopScope pare over the same record.
// It has sence to avoid adresing this field through array access.
private int lastScopes = 0;
public CompilerScopeManager() {
Reset();
}
private void Reset() {
// The prefix 'xml' is by definition bound to the namespace name http://www.w3.org/XML/1998/namespace
records[0].ncName = "xml";
records[0].nsUri = XmlReservedNs.NsXml;
lastRecord = LastPredefRecord;
}
public void PushScope() {
lastScopes++;
}
public void PopScope() {
if (0 < lastScopes) {
lastScopes--;
} else {
while (records[--lastRecord].scopeCount == 0) {
}
lastScopes = records[lastRecord].scopeCount;
lastScopes--;
}
}
private void AddRecord(string ncName, string uri, V value) {
Debug.Assert(uri != null);
records[lastRecord].scopeCount = lastScopes;
if (++lastRecord == records.Length) {
ScopeRecord[] newRecords = new ScopeRecord[lastRecord * 2];
Array.Copy(records, 0, newRecords, 0, lastRecord);
records = newRecords;
}
lastScopes = 0;
records[lastRecord].ncName = ncName;
records[lastRecord].nsUri = uri;
records[lastRecord].value = value;
}
// Add namespace declaration (prefix != null) or namespace extension or exclusion (prefix == null) to the current scope.
public void AddNamespace(string prefix, string uri) {
AddRecord(prefix, uri, default(V));
}
// Add variable to the current scope. Returns false in case of duplicates.
public void AddVariable(QilName varName, V value) {
Debug.Assert(varName.LocalName != null && varName.NamespaceUri != null && value != default(V));
AddRecord(varName.LocalName, varName.NamespaceUri, value);
}
// Since the prefix might be redefined in an inner scope, we search in descending order in [to, from]
// If interval is empty (from < to), the function returns null.
private string LookupNamespace(string prefix, int from, int to) {
Debug.Assert(prefix != null);
for (int record = from; to <= record; --record) {
if (
records[record].IsNamespace &&
records[record].ncName == prefix
) {
return records[record].nsUri;
}
}
return null;
}
public string LookupNamespace(string prefix) {
return LookupNamespace(prefix, lastRecord, 0);
}
public bool IsExNamespace(string nsUri) {
Debug.Assert(nsUri != null);
for (int record = lastRecord; 0 <= record; record--) {
if (
records[record].IsExNamespace &&
records[record].nsUri == nsUri
) {
return true;
}
}
return false;
}
private int SearchVariable(string localName, string uri) {
Debug.Assert(localName != null);
for (int record = lastRecord; 0 <= record; --record) {
if (
records[record].IsVariable &&
records[record].ncName == localName &&
records[record].nsUri == uri
) {
return record;
}
}
return -1;
}
public V LookupVariable(string localName, string uri) {
int record = SearchVariable(localName, uri);
return (record < 0) ? default(V) : records[record].value;
}
public bool IsLocalVariable(string localName, string uri) {
int record = SearchVariable(localName, uri);
while (0 <= --record) {
if (records[record].scopeCount != 0) {
return true;
}
}
return false;
}
IEnumerator IEnumerable.GetEnumerator() {
return new NamespaceEnumerator(this);
}
// Class for enumerating namespaces that must be output with literal result element.
private sealed class NamespaceEnumerator : IEnumerator {
CompilerScopeManager scope;
int lastRecord;
int currentRecord;
public NamespaceEnumerator(CompilerScopeManager scope) {
this.scope = scope;
this.lastRecord = scope.lastRecord;
Reset();
}
public void Reset() {
currentRecord = lastRecord + 1;
}
public bool MoveNext() {
while (LastPredefRecord < --currentRecord) {
if (scope.records[currentRecord].IsNamespace) {
// This is a namespace declaration
if (scope.LookupNamespace(scope.records[currentRecord].ncName, lastRecord, currentRecord + 1) == null) {
// Its prefix has not been redefined later in [currentRecord + 1, lastRecord]
return true;
}
}
}
return false;
}
public object Current {
get {
Debug.Assert(LastPredefRecord <= currentRecord && currentRecord <= scope.lastRecord, "MoveNext() either was not called or returned false");
Debug.Assert(scope.records[currentRecord].IsNamespace);
return scope.records[currentRecord];
}
}
}
}
}
// 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
- DataGridViewColumnTypeEditor.cs
- AssemblyCache.cs
- CryptoApi.cs
- CodeComment.cs
- EncoderParameters.cs
- ConvertEvent.cs
- NetStream.cs
- PeerNameRegistration.cs
- DataGridCommandEventArgs.cs
- CompositeFontInfo.cs
- OdbcEnvironmentHandle.cs
- XPathDescendantIterator.cs
- XmlSerializationGeneratedCode.cs
- WebDisplayNameAttribute.cs
- ByteAnimationBase.cs
- QueryExpr.cs
- FormViewUpdateEventArgs.cs
- SchemaImporter.cs
- DataTableTypeConverter.cs
- DataSysAttribute.cs
- DiscoveryDefaults.cs
- SizeConverter.cs
- SolidColorBrush.cs
- PrivateFontCollection.cs
- ParagraphResult.cs
- DirtyTextRange.cs
- ClientScriptManager.cs
- RealProxy.cs
- ComponentManagerBroker.cs
- CheckBox.cs
- WebPartEditorOkVerb.cs
- BrowserInteropHelper.cs
- DefaultAutoFieldGenerator.cs
- WsdlInspector.cs
- FieldMetadata.cs
- FilterElement.cs
- XMLSchema.cs
- UndoManager.cs
- UseAttributeSetsAction.cs
- ImageCreator.cs
- PersonalizationStateInfoCollection.cs
- SessionStateModule.cs
- Pkcs9Attribute.cs
- CustomBindingCollectionElement.cs
- PagesSection.cs
- FlowDocumentView.cs
- GiveFeedbackEventArgs.cs
- EmbeddedMailObject.cs
- Schedule.cs
- HttpServerUtilityBase.cs
- XmlAttributes.cs
- CustomAssemblyResolver.cs
- SmiContextFactory.cs
- EntityDataSourceDataSelectionPanel.cs
- WhileDesigner.cs
- MethodToken.cs
- FormsAuthenticationModule.cs
- HtmlShimManager.cs
- XmlNullResolver.cs
- CodeExpressionStatement.cs
- RowTypePropertyElement.cs
- ValueUtilsSmi.cs
- DiscoveryOperationContext.cs
- IfJoinedCondition.cs
- AttachmentCollection.cs
- DrawingVisual.cs
- TableCellCollection.cs
- Section.cs
- Publisher.cs
- MemberAssignment.cs
- CLRBindingWorker.cs
- AxisAngleRotation3D.cs
- TraceFilter.cs
- ProtocolImporter.cs
- HMAC.cs
- HostSecurityManager.cs
- MemoryResponseElement.cs
- ProfileService.cs
- PermissionSetTriple.cs
- graph.cs
- IPCCacheManager.cs
- CompModSwitches.cs
- Size.cs
- XmlSchemaRedefine.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- CheckBox.cs
- Schema.cs
- WindowHelperService.cs
- MobileUITypeEditor.cs
- _ListenerRequestStream.cs
- DataGridItemCollection.cs
- TableColumnCollectionInternal.cs
- BindingWorker.cs
- FontInfo.cs
- MonikerSyntaxException.cs
- IpcChannelHelper.cs
- DecoratedNameAttribute.cs
- DataGridLengthConverter.cs
- PrintControllerWithStatusDialog.cs
- WebProxyScriptElement.cs