/// <summary> /// Constructs a scoped item lookup path. /// </summary> /// <param name="path">The path to parse.</param> /// <param name="knownFlags"> /// These flags for anything known about the path (such as, is it a function) before /// being scanned. /// </param> /// <exception cref="ArgumentNullException"> /// If <paramref name="path"/> is null. /// </exception> internal VariablePath(string path, VariablePathFlags knownFlags) { if (string.IsNullOrEmpty(path)) { throw PSTraceSource.NewArgumentException("path"); } _userPath = path; _flags = knownFlags; string candidateScope = null; string candidateScopeUpper = null; VariablePathFlags candidateFlags = VariablePathFlags.Unqualified; int currentCharIndex = 0; int lastScannedColon = -1; scanScope: switch (path[0]) { case 'g': case 'G': candidateScope = "lobal"; candidateScopeUpper = "LOBAL"; candidateFlags = VariablePathFlags.Global; break; case 'l': case 'L': candidateScope = "ocal"; candidateScopeUpper = "OCAL"; candidateFlags = VariablePathFlags.Local; break; case 'p': case 'P': candidateScope = "rivate"; candidateScopeUpper = "RIVATE"; candidateFlags = VariablePathFlags.Private; break; case 's': case 'S': candidateScope = "cript"; candidateScopeUpper = "CRIPT"; candidateFlags = VariablePathFlags.Script; break; case 'v': case 'V': if (knownFlags == VariablePathFlags.None) { // If we see 'variable:', our namespaceId will be empty, and // we'll also need to scan for the scope again. candidateScope = "ariable"; candidateScopeUpper = "ARIABLE"; candidateFlags = VariablePathFlags.Variable; } break; } if (candidateScope != null) { currentCharIndex += 1; // First character already matched. int j; for (j = 0; currentCharIndex < path.Length && j < candidateScope.Length; ++j, ++currentCharIndex) { if (path[currentCharIndex] != candidateScope[j] && path[currentCharIndex] != candidateScopeUpper[j]) { break; } } if (j == candidateScope.Length && currentCharIndex < path.Length && path[currentCharIndex] == ':') { if (_flags == VariablePathFlags.None) { _flags = VariablePathFlags.Variable; } _flags |= candidateFlags; lastScannedColon = currentCharIndex; currentCharIndex += 1; // If saw 'variable:', we need to look for a scope after 'variable:'. if (candidateFlags == VariablePathFlags.Variable) { knownFlags = VariablePathFlags.Variable; candidateScope = candidateScopeUpper = null; candidateFlags = VariablePathFlags.None; goto scanScope; } } } if (_flags == VariablePathFlags.None) { lastScannedColon = path.IndexOf(':', currentCharIndex); // No colon, or a colon as the first character means we have // a simple variable, otherwise it's a drive. if (lastScannedColon > 0) { _flags = VariablePathFlags.DriveQualified; } } if (lastScannedColon == -1) { _unqualifiedPath = _userPath; } else { _unqualifiedPath = _userPath.Substring(lastScannedColon + 1); } if (_flags == VariablePathFlags.None) { _flags = VariablePathFlags.Unqualified | VariablePathFlags.Variable; } }
internal VariablePath(string path, VariablePathFlags knownFlags) { if (string.IsNullOrEmpty(path)) { throw PSTraceSource.NewArgumentException("path"); } this._userPath = path; this._flags = knownFlags; string str = null; string str2 = null; VariablePathFlags unqualified = VariablePathFlags.Unqualified; int startIndex = 0; int index = -1; Label_0036: switch (path[0]) { case 'P': case 'p': str = "rivate"; str2 = "RIVATE"; unqualified = VariablePathFlags.Private; break; case 'S': case 's': str = "cript"; str2 = "CRIPT"; unqualified = VariablePathFlags.Script; break; case 'V': case 'v': if (knownFlags == VariablePathFlags.None) { str = "ariable"; str2 = "ARIABLE"; unqualified = VariablePathFlags.Variable; } break; case 'G': case 'g': str = "lobal"; str2 = "LOBAL"; unqualified = VariablePathFlags.Global; break; case 'L': case 'l': str = "ocal"; str2 = "OCAL"; unqualified = VariablePathFlags.Local; break; } if (str != null) { startIndex++; int num3 = 0; while ((startIndex < path.Length) && (num3 < str.Length)) { if ((path[startIndex] != str[num3]) && (path[startIndex] != str2[num3])) { break; } num3++; startIndex++; } if (((num3 == str.Length) && (startIndex < path.Length)) && (path[startIndex] == ':')) { if (this._flags == VariablePathFlags.None) { this._flags = VariablePathFlags.Variable; } this._flags |= unqualified; index = startIndex; startIndex++; if (unqualified == VariablePathFlags.Variable) { knownFlags = VariablePathFlags.Variable; str = (string) (str2 = null); unqualified = VariablePathFlags.None; goto Label_0036; } } } if (this._flags == VariablePathFlags.None) { index = path.IndexOf(':', startIndex); if (index > 0) { this._flags = VariablePathFlags.DriveQualified; } } if (index == -1) { this._unqualifiedPath = this._userPath; } else { this._unqualifiedPath = this._userPath.Substring(index + 1); } if (this._flags == VariablePathFlags.None) { this._flags = VariablePathFlags.Unqualified | VariablePathFlags.Variable; } }
/// <summary> /// Constructs a scoped item lookup path. /// </summary> /// /// <param name="path">The path to parse.</param> /// <param name="knownFlags"> /// These flags for anything known about the path (such as, is it a function) before /// being scanned. /// </param> /// /// <exception cref="ArgumentNullException"> /// If <paramref name="path"/> is null. /// </exception> internal VariablePath(string path, VariablePathFlags knownFlags) { if (string.IsNullOrEmpty(path)) { throw PSTraceSource.NewArgumentException("path"); } _userPath = path; _flags = knownFlags; string candidateScope = null; string candidateScopeUpper = null; VariablePathFlags candidateFlags = VariablePathFlags.Unqualified; int currentCharIndex = 0; int lastScannedColon = -1; scanScope: switch (path[0]) { case 'g': case 'G': candidateScope = "lobal"; candidateScopeUpper = "LOBAL"; candidateFlags = VariablePathFlags.Global; break; case 'l': case 'L': candidateScope = "ocal"; candidateScopeUpper = "OCAL"; candidateFlags = VariablePathFlags.Local; break; case 'p': case 'P': candidateScope = "rivate"; candidateScopeUpper = "RIVATE"; candidateFlags = VariablePathFlags.Private; break; case 's': case 'S': candidateScope = "cript"; candidateScopeUpper = "CRIPT"; candidateFlags = VariablePathFlags.Script; break; case 'v': case 'V': if (knownFlags == VariablePathFlags.None) { // If we see 'variable:', our namespaceId will be empty, and // we'll also need to scan for the scope again. candidateScope = "ariable"; candidateScopeUpper = "ARIABLE"; candidateFlags = VariablePathFlags.Variable; } break; } if (candidateScope != null) { currentCharIndex += 1; // First character already matched. int j; for (j = 0; currentCharIndex < path.Length && j < candidateScope.Length; ++j, ++currentCharIndex) { if (path[currentCharIndex] != candidateScope[j] && path[currentCharIndex] != candidateScopeUpper[j]) { break; } } if (j == candidateScope.Length && currentCharIndex < path.Length && path[currentCharIndex] == ':') { if (_flags == VariablePathFlags.None) { _flags = VariablePathFlags.Variable; } _flags |= candidateFlags; lastScannedColon = currentCharIndex; currentCharIndex += 1; // If saw 'variable:', we need to look for a scope after 'variable:'. if (candidateFlags == VariablePathFlags.Variable) { knownFlags = VariablePathFlags.Variable; candidateScope = candidateScopeUpper = null; candidateFlags = VariablePathFlags.None; goto scanScope; } } } if (_flags == VariablePathFlags.None) { lastScannedColon = path.IndexOf(':', currentCharIndex); // No colon, or a colon as the first character means we have // a simple variable, otherwise it's a drive. if (lastScannedColon > 0) { _flags = VariablePathFlags.DriveQualified; } } if (lastScannedColon == -1) { _unqualifiedPath = _userPath; } else { _unqualifiedPath = _userPath.Substring(lastScannedColon + 1); } if (_flags == VariablePathFlags.None) { _flags = VariablePathFlags.Unqualified | VariablePathFlags.Variable; } }
internal VariablePath(string path, VariablePathFlags knownFlags) { if (string.IsNullOrEmpty(path)) { throw PSTraceSource.NewArgumentException("path"); } this._userPath = path; this._flags = knownFlags; string str = null; string str2 = null; VariablePathFlags unqualified = VariablePathFlags.Unqualified; int startIndex = 0; int index = -1; Label_0036: switch (path[0]) { case 'P': case 'p': str = "rivate"; str2 = "RIVATE"; unqualified = VariablePathFlags.Private; break; case 'S': case 's': str = "cript"; str2 = "CRIPT"; unqualified = VariablePathFlags.Script; break; case 'V': case 'v': if (knownFlags == VariablePathFlags.None) { str = "ariable"; str2 = "ARIABLE"; unqualified = VariablePathFlags.Variable; } break; case 'G': case 'g': str = "lobal"; str2 = "LOBAL"; unqualified = VariablePathFlags.Global; break; case 'L': case 'l': str = "ocal"; str2 = "OCAL"; unqualified = VariablePathFlags.Local; break; } if (str != null) { startIndex++; int num3 = 0; while ((startIndex < path.Length) && (num3 < str.Length)) { if ((path[startIndex] != str[num3]) && (path[startIndex] != str2[num3])) { break; } num3++; startIndex++; } if (((num3 == str.Length) && (startIndex < path.Length)) && (path[startIndex] == ':')) { if (this._flags == VariablePathFlags.None) { this._flags = VariablePathFlags.Variable; } this._flags |= unqualified; index = startIndex; startIndex++; if (unqualified == VariablePathFlags.Variable) { knownFlags = VariablePathFlags.Variable; str = (string)(str2 = null); unqualified = VariablePathFlags.None; goto Label_0036; } } } if (this._flags == VariablePathFlags.None) { index = path.IndexOf(':', startIndex); if (index > 0) { this._flags = VariablePathFlags.DriveQualified; } } if (index == -1) { this._unqualifiedPath = this._userPath; } else { this._unqualifiedPath = this._userPath.Substring(index + 1); } if (this._flags == VariablePathFlags.None) { this._flags = VariablePathFlags.Unqualified | VariablePathFlags.Variable; } }