예제 #1
0
        /// <summary>
        /// This routine replaces all place-holders in the given command line string.
        /// </summary>
        private string ReplacePlaceholders(string CmdLineText)
        {
            string MethodName = "Pipe.ReplacePlaceholders";
            char   Ch;
            int    CharPos             = 0;
            int    BegPosOfPlaceHolder = 0;
            int    PosOfNum            = 0;
            string FilterSwitchID      = string.Empty;
            string PipeSwitchID        = string.Empty;
            int    FirstIndex          = 0;
            int    LastIndex           = 0;
            bool   Done = false;
            string TempStr;

            LogWrite(MethodName + ": Raw Cmdline = \"" + CmdLineText + "\"");
            int  State    = 0;
            bool inString = false;

            ToState(ref State, 10, MethodName);

            do
            {
                Ch = GetNextChar(CmdLineText, ref CharPos, "CmdLine", ref inString);

                switch (State)
                {
                case 10:

                    // Looking for opening bracket "[".

                    if (Ch == '[')
                    {
                        BegPosOfPlaceHolder = CharPos - 1;
                        ToState(ref State, 20, MethodName);
                    }
                    else
                    {
                        if (Ch == '\0')
                        {
                            Done = true;
                        }
                    }

                    break;

                case 20:

                    // Looking either for a positional index's first digit
                    // or a slash (/).

                    if (Char.IsDigit(Ch))
                    {
                        // Must be a positional placeholder.

                        PosOfNum = CharPos - 1;
                        ToState(ref State, 30, MethodName);
                    }
                    else
                    {
                        if (Ch == '/')
                        {
                            // Must be a switch placeholder.

                            ToState(ref State, 60, MethodName);
                        }
                        else
                        {
                            if (Ch == '\0')
                            {
                                Done = true;
                            }
                            else
                            {
                                // Character not expected.  Backtrack a character:

                                CharPos--;
                                ToState(ref State, 10, MethodName);
                            }
                        }
                    }

                    break;

                case 30:

                    // Looking for the index's remaining digits.

                    if (Ch == '\0')
                    {
                        Done = true;
                    }
                    else
                    {
                        if (Char.IsDigit(Ch))
                        {
                            // Do nothing
                        }
                        else
                        {
                            if (Ch == ']')
                            {
                                // Located a simple positional place holder.  Get the index:

                                FirstIndex = Int32.Parse(CmdLineText.Substring(PosOfNum, CharPos - PosOfNum - 1)) - 1;

                                // Get the argument:

                                try
                                {
                                    TempStr = GetArg(FirstIndex, inString);
                                }

                                catch (PipeWrenchCompileException ex)
                                {
                                    ex.Data.Add("CmdLine", CmdLineText);
                                    ex.Data.Add("CharPos", CharPos);
                                    throw ex;
                                }

                                // Delete the place holder:

                                CmdLineText = CmdLineText.Remove(BegPosOfPlaceHolder, CharPos - BegPosOfPlaceHolder);
                                CharPos    -= CharPos - BegPosOfPlaceHolder;

                                // Insert the argument:

                                CmdLineText = CmdLineText.Insert(BegPosOfPlaceHolder, TempStr);
                                CharPos    += TempStr.Length;
                                ToState(ref State, 10, MethodName);
                            }
                            else
                            {
                                if (Ch == '-')
                                {
                                    // Matching a positional "range" placeholder.  Get the first index:

                                    FirstIndex = Int32.Parse(CmdLineText.Substring(PosOfNum, CharPos - PosOfNum - 1)) - 1;
                                    ToState(ref State, 40, MethodName);
                                }
                                else
                                {
                                    // Character not expected.  Backtrack a character:

                                    CharPos--;
                                    ToState(ref State, 10, MethodName);
                                }
                            }
                        }
                    }

                    break;

                case 40:

                    // Looking for last index's first digit.

                    if (Ch == '\0')
                    {
                        Done = true;
                    }
                    else
                    {
                        if (Ch == ']')
                        {
                            // Located an infinite range place holder.  Set
                            // the last index to indicate an infinite range:

                            LastIndex = CmdLine.ArgCount - 1;

                            // Process the place holder:

                            ReplacePlaceHolderRange(FirstIndex, LastIndex, BegPosOfPlaceHolder,
                                                    ref CharPos, ref CmdLineText, inString);
                            ToState(ref State, 10, MethodName);
                        }
                        else
                        {
                            if (Char.IsDigit(Ch))
                            {
                                PosOfNum = CharPos - 1;
                                ToState(ref State, 50, MethodName);
                            }
                            else
                            {
                                // Character not expected.  Backtrack a character:

                                CharPos--;
                                ToState(ref State, 10, MethodName);
                            }
                        }
                    }

                    break;

                case 50:

                    // Looking for last index's remaining digits.

                    if (Ch == '\0')
                    {
                        Done = true;
                    }
                    else
                    {
                        if (Ch == ']')
                        {
                            // Located a closed range place holder.  Get the last index:

                            LastIndex = Int32.Parse(CmdLineText.Substring(PosOfNum, CharPos - PosOfNum - 1)) - 1;

                            // Process the place holder:

                            ReplacePlaceHolderRange(FirstIndex, LastIndex, BegPosOfPlaceHolder,
                                                    ref CharPos, ref CmdLineText, inString);
                            ToState(ref State, 10, MethodName);
                        }
                        else
                        {
                            if (Char.IsDigit(Ch))
                            {
                                // Do nothing
                            }
                            else
                            {
                                // Character not expected.  Backtrack a character:

                                CharPos--;
                                ToState(ref State, 10, MethodName);
                            }
                        }
                    }

                    break;

                case 60:

                    // Looking for the filter's switch identifier.

                    if (Ch == '\0')
                    {
                        Done = true;
                    }
                    else
                    {
                        if (Char.IsLetter(Ch))
                        {
                            // Got the switch ID.

                            FilterSwitchID = Ch.ToString();
                            ToState(ref State, 70, MethodName);
                        }
                        else
                        {
                            // Character not expected.  Backtrack a character:

                            CharPos--;
                            ToState(ref State, 10, MethodName);
                        }
                    }

                    break;

                case 70:

                    // Looking for an equal sign character.

                    if (Ch == '\0')
                    {
                        Done = true;
                    }
                    else
                    {
                        if (Ch == '=')
                        {
                            // Got the equal sign character.

                            ToState(ref State, 80, MethodName);
                        }
                        else
                        {
                            // Character not expected.  Backtrack a character:

                            CharPos--;
                            ToState(ref State, 10, MethodName);
                        }
                    }

                    break;

                case 80:

                    // Looking for either a pipe's switch identifier or the
                    // first digit of a positional parameter index (a number).

                    if (Ch == '\0')
                    {
                        Done = true;
                    }
                    else
                    {
                        if (Char.IsLetter(Ch))
                        {
                            // Got the switch ID.

                            PipeSwitchID = Ch.ToString();
                            ToState(ref State, 90, MethodName);
                        }
                        else
                        {
                            if (Char.IsDigit(Ch))
                            {
                                // Got the first digit of a positional index.

                                PosOfNum = CharPos - 1;
                                ToState(ref State, 100, MethodName);
                            }
                            else
                            {
                                // Character not expected.  Backtrack a character:

                                CharPos--;
                                ToState(ref State, 10, MethodName);
                            }
                        }
                    }

                    break;

                case 90:

                    // Looking for closing bracket character.

                    if (Ch == '\0')
                    {
                        Done = true;
                    }
                    else
                    {
                        if (Ch == ']')
                        {
                            // Located a switch placeholder mapped to a switch parameter.
                            // Delete the place holder:

                            CmdLineText = CmdLineText.Remove(BegPosOfPlaceHolder, CharPos - BegPosOfPlaceHolder);
                            CharPos    -= CharPos - BegPosOfPlaceHolder;

                            int i = CmdLine.GetSwitchIndex("/" + PipeSwitchID);

                            if (i > -1)
                            {
                                // The switch was passed to the pipe.

                                TempStr = string.Empty;

                                if (CmdLine.GetSwitch(i).Value != null)
                                {
                                    // Is numeric or string switch.  Insert the
                                    // switch's value into the command line:

                                    TempStr = CmdLine.GetSwitch(i).Value.ToString();

                                    if (CmdLine.GetSwitch(i).Value is string)
                                    {
                                        // Quote the string:

                                        TempStr = "'" + TempStr + "'";
                                    }
                                }

                                // Insert the replacement text:

                                CmdLineText = CmdLineText.Insert(BegPosOfPlaceHolder, "/" + FilterSwitchID + TempStr);
                                CharPos    += TempStr.Length + 2;
                            }

                            ToState(ref State, 10, MethodName);
                        }
                        else
                        {
                            // Character not expected.  Backtrack a character:

                            CharPos--;
                            ToState(ref State, 10, MethodName);
                        }
                    }

                    break;

                case 100:

                    // Looking for the remaining digits of a positional index.

                    if (Ch == '\0')
                    {
                        Done = true;
                    }
                    else
                    {
                        if (Char.IsDigit(Ch))
                        {
                            // Do nothing
                        }
                        else
                        {
                            if (Ch == ']')
                            {
                                // Located a switch placeholder mapped to
                                // a positional parameter.  Get the index:

                                FirstIndex = Int32.Parse(CmdLineText.Substring(PosOfNum, CharPos - PosOfNum - 1)) - 1;

                                // Get the argument:

                                try
                                {
                                    TempStr = GetArg(FirstIndex, inString);
                                }

                                catch (PipeWrenchCompileException ex)
                                {
                                    ex.Data.Add("CmdLine", CmdLineText);
                                    ex.Data.Add("CharPos", CharPos);
                                    throw ex;
                                }

                                // Delete the place holder:

                                CmdLineText = CmdLineText.Remove(BegPosOfPlaceHolder, CharPos - BegPosOfPlaceHolder);
                                CharPos    -= CharPos - BegPosOfPlaceHolder;

                                // Insert the argument:

                                CmdLineText = CmdLineText.Insert(BegPosOfPlaceHolder, "/" + FilterSwitchID + TempStr);
                                CharPos    += TempStr.Length;
                                ToState(ref State, 10, MethodName);
                            }
                            else
                            {
                                // Character not expected.  Backtrack a character:

                                CharPos--;
                                ToState(ref State, 10, MethodName);
                            }
                        }
                    }

                    break;
                }
            }while (!Done);

            LogWrite(MethodName + ": Translated Cmdline = \"" + CmdLineText + "\"");
            return(CmdLineText);
        }