Example #1
0
        /// <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;
            }
        }
Example #2
0
        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;
            }
        }
Example #3
0
        /// <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;
            }
        }
Example #4
0
        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;
            }
        }