Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / 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
![Network programming in C#, Network Programming in VB.NET, Network Programming in .NET](/images/book.jpg)
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SQLDouble.cs
- MissingSatelliteAssemblyException.cs
- EventMetadata.cs
- RecordBuilder.cs
- SHA1Managed.cs
- DataGridPageChangedEventArgs.cs
- RSAPKCS1SignatureDeformatter.cs
- RelativeSource.cs
- ToolStripSplitStackLayout.cs
- UDPClient.cs
- FormViewModeEventArgs.cs
- CallbackHandler.cs
- StylusButton.cs
- Vector3DCollectionConverter.cs
- Inflater.cs
- EditorAttribute.cs
- ItemMap.cs
- EUCJPEncoding.cs
- DbConnectionPool.cs
- Win32MouseDevice.cs
- StructuralCache.cs
- BrushMappingModeValidation.cs
- SqlTriggerAttribute.cs
- StylusPointPropertyId.cs
- StdValidatorsAndConverters.cs
- RootProfilePropertySettingsCollection.cs
- FaultBookmark.cs
- StrokeCollectionDefaultValueFactory.cs
- TreeNodeBindingDepthConverter.cs
- DataServiceBehavior.cs
- PreservationFileWriter.cs
- TypefaceMap.cs
- IdentifierCollection.cs
- StylusPointProperty.cs
- ToolStripPanelCell.cs
- Vertex.cs
- DataGridViewToolTip.cs
- ApplicationId.cs
- CompensationDesigner.cs
- PointLight.cs
- URLString.cs
- Helper.cs
- Rotation3D.cs
- WebPartTransformerCollection.cs
- DataBoundControlAdapter.cs
- Zone.cs
- UriTemplateClientFormatter.cs
- EndPoint.cs
- Size3D.cs
- MarshalByRefObject.cs
- IconHelper.cs
- KeyValueInternalCollection.cs
- SdlChannelSink.cs
- MethodExpr.cs
- SafeViewOfFileHandle.cs
- ToolboxComponentsCreatedEventArgs.cs
- FormViewPageEventArgs.cs
- WebBrowserProgressChangedEventHandler.cs
- StylusPointPropertyId.cs
- ContractUtils.cs
- SrgsToken.cs
- WorkflowInvoker.cs
- DbProviderFactoriesConfigurationHandler.cs
- SecurityMessageProperty.cs
- Propagator.ExtentPlaceholderCreator.cs
- AdditionalEntityFunctions.cs
- oledbmetadatacolumnnames.cs
- UIElementParagraph.cs
- StaticExtension.cs
- QueryStringParameter.cs
- PassportAuthenticationEventArgs.cs
- ZeroOpNode.cs
- LineServicesCallbacks.cs
- ExtenderHelpers.cs
- ToolStripLocationCancelEventArgs.cs
- WebUtil.cs
- FontStyleConverter.cs
- BoundsDrawingContextWalker.cs
- CharacterMetricsDictionary.cs
- ApplicationId.cs
- FormsAuthenticationConfiguration.cs
- CheckBox.cs
- ButtonPopupAdapter.cs
- NavigationHelper.cs
- DataKey.cs
- HttpRawResponse.cs
- InkSerializer.cs
- PathFigureCollection.cs
- CalendarAutoFormat.cs
- SessionPageStateSection.cs
- TextReader.cs
- CodeGeneratorOptions.cs
- RelatedEnd.cs
- DataGridViewCellStyleContentChangedEventArgs.cs
- SecurityManager.cs
- TypeSource.cs
- RightsManagementResourceHelper.cs
- PropertyGeneratedEventArgs.cs
- SafeMILHandle.cs
- DrawListViewItemEventArgs.cs