Example #1
0
        /// <summary>
        /// include met line
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public PatchTask SkipUntilAndAccept(string text)
        {
            var cmd = new PatchCommand(this.TaskId, PatchCommandKind.SkipUntilAndAccept, text);

            commands.Add(cmd);
            return(this);
        }
Example #2
0
        public PatchTask FindNext(string landMark)
        {
            var cmd = new PatchCommand(this.TaskId, PatchCommandKind.FindNextLandMark, landMark);

            commands.Add(cmd);
            return(this);
        }
Example #3
0
        public PatchTask FollowBy(string landMark)
        {
            var cmd = new PatchCommand(this.TaskId, PatchCommandKind.FollowBy, landMark);

            commands.Add(cmd);
            return(this);
        }
Example #4
0
        public PatchTask Append(string appendString)
        {
            var cmd = new PatchCommand(this.TaskId, PatchCommandKind.AppendStringStart, appendString);

            commands.Add(cmd);
            return(this);
        }
Example #5
0
        public void PatchFile(SourceFile input, SourceFile output)
        {
            //------------------------------------------------------------
            if (this.IsPatchBlock)
            {
                throw new NotSupportedException();
            }
            //------------------------------------------------------------


            //find start position of this task
            int  curLine       = input.CurrentLine;
            int  lineCount     = input.LineCount;
            bool foundLandMark = false;
            int  cur_line_id   = curLine;



            for (; cur_line_id < lineCount; ++cur_line_id)
            {
                string line = input.GetLine(cur_line_id);
                input.CurrentLine++;

                if (line.TrimStart().StartsWith(this.LandMark))
                {
                    //found land mark
                    foundLandMark = true;

                    string newStartLine = PatchCommand.START + " " + this.TaskId;
                    if (!string.IsNullOrEmpty(this.PatchStartCmd))
                    {
                        newStartLine += " " + this.PatchStartCmd;
                    }
                    if (!output.IsCMakeFile)
                    {
                        output.AddLine(newStartLine);
                    }

                    if (this.PatchStartCmd == "-X")
                    {
                        //replace the original line with the land mark
                        output.AddLine(this.LandMark);
                    }
                    else
                    {
                        output.AddLine(line);
                    }
                    break;
                }
                else
                {
                    //just add to output
                    output.AddLine(line);
                }
            }

            if (!foundLandMark)
            {
                //report
                System.Diagnostics.Debug.WriteLine("not completed :" + input.Filename + ", landmark: " + this.LandMark);
                return;

                throw new NotSupportedException();
            }
            //------------------------------------------------------------
            //do actions...
            int j = commands.Count;

            for (int c = 0; c < j; ++c)
            {
                PatchCommand cmd = commands[c];
                //find start position
                switch (cmd.comandKind)
                {
                case PatchCommandKind.FindNextLandMark:
                {
                    //from current position find next until found
                    curLine = input.CurrentLine;
                    bool foundNextLandMark = false;
                    for (int i = curLine; i < lineCount; ++i)
                    {
                        string line = input.GetLine(i);
                        input.CurrentLine++;

                        if (line.TrimStart().StartsWith(cmd.String))
                        {
                            //found land mark
                            foundNextLandMark = true;
                            AddControlLine(output, cmd);         //***
                            output.AddLine(line);
                            break;
                        }
                        else
                        {
                            //just add to output
                            output.AddLine(line);
                        }
                    }

                    if (!foundNextLandMark)
                    {
                        throw new NotSupportedException("next land mark not found");
                    }
                }
                break;

                case PatchCommandKind.AppendStringStart:
                {
                    AddControlLine(output, cmd);         //***
                }
                break;

                case PatchCommandKind.FollowBy:
                {
                    //just 1 line must match

                    string nextLine = input.GetLine(input.CurrentLine);
                    input.CurrentLine++;

                    if (nextLine.TrimStart().StartsWith(cmd.String))
                    {
                        //match
                        AddControlLine(output, cmd);         //***
                        output.AddLine(nextLine);
                    }
                    else
                    {
                        throw new NotSupportedException();
                    }
                }
                break;

                case PatchCommandKind.SkipUntilPass:
                {
                    curLine = input.CurrentLine;
                    bool foundNextLandMark = false;
                    for (int i = curLine; i < lineCount; ++i)
                    {
                        string line = input.GetLine(i);
                        input.CurrentLine++;

                        if (line.TrimStart().StartsWith(cmd.String))
                        {
                            AddControlLine(output, cmd);         //***
                            //found land mark
                            foundNextLandMark = true;
                            //not add this
                            //just skip
                            break;
                        }
                        else
                        {
                            //skip
                        }
                    }

                    if (!foundNextLandMark)
                    {
                        throw new NotSupportedException("next land mark not found");
                    }
                }
                break;

                case PatchCommandKind.SkipUntilAndAccept:
                {
                    curLine = input.CurrentLine;
                    bool foundNextLandMark = false;
                    for (int i = curLine; i < lineCount; ++i)
                    {
                        string line = input.GetLine(i);
                        input.CurrentLine++;

                        if (line.TrimStart().StartsWith(cmd.String))
                        {
                            //found land mark
                            foundNextLandMark = true;
                            //accept this line
                            AddControlLine(output, cmd);         //***
                            output.AddLine(line);
                            break;
                        }
                        else
                        {
                            //skip
                        }
                    }

                    if (!foundNextLandMark)
                    {
                        throw new NotSupportedException("next land mark not found");
                    }
                }
                break;

                default:
                    throw new NotSupportedException();
                }
            }
        }
Example #6
0
 void AddControlLine(SourceFile outputFile, PatchCommand cmd)
 {
     PatchWriter.WriteCommand(outputFile, cmd, false);
 }
Example #7
0
        public static void WriteCommand(SourceFile outputFile, PatchCommand cmd, bool withValue)
        {
            string perfix_comment = outputFile.IsCMakeFile ? "# " : "";

            switch (cmd.comandKind)
            {
            case PatchCommandKind.AppendStringStart:
            {
                outputFile.AddLine(perfix_comment + PatchCommand.APPPEND_START + " " + cmd.TaskId);
                var    strReader  = new StringReader(cmd.String);
                string appendLine = strReader.ReadLine();
                while (appendLine != null)
                {
                    outputFile.AddLine(appendLine);
                    appendLine = strReader.ReadLine();
                }
                outputFile.AddLine(perfix_comment + PatchCommand.APPPEND_STOP);
            }
            break;

            case PatchCommandKind.AppendStringStop:
                outputFile.AddLine(perfix_comment + PatchCommand.APPPEND_STOP + " " + cmd.TaskId);
                if (withValue)
                {
                    outputFile.AddLine(cmd.String);
                }
                break;

            case PatchCommandKind.FindNextLandMark:
                outputFile.AddLine(perfix_comment + PatchCommand.FIND_NEXT_LANDMARK + " " + cmd.TaskId);
                if (withValue)
                {
                    outputFile.AddLine(cmd.String);
                }
                break;

            case PatchCommandKind.FollowBy:
                outputFile.AddLine(perfix_comment + PatchCommand.FOLLOW_BY + " " + cmd.TaskId);
                if (withValue)
                {
                    outputFile.AddLine(cmd.String);
                }
                break;

            case PatchCommandKind.SkipUntilAndAccept:
                outputFile.AddLine(perfix_comment + PatchCommand.SKIP_UNTIL_AND_ACCEPT + " " + cmd.TaskId);
                if (withValue)
                {
                    outputFile.AddLine(cmd.String);
                }
                break;

            case PatchCommandKind.SkipUntilPass:
                outputFile.AddLine(perfix_comment + PatchCommand.SKIP_UNTIL_PASS + " " + cmd.TaskId + " " + cmd.String);
                //value is add in the same line ***
                break;

            default:
                throw new NotSupportedException();
            }
        }
Example #8
0
        public void PatchFile(SourceFile input, SourceFile output)
        {
            //find start position of this task
            int  curLine       = input.CurrentLine;
            int  lineCount     = input.LineCount;
            bool foundLandMark = false;

            for (int i = curLine; i < lineCount; ++i)
            {
                string line = input.GetLine(i);
                input.CurrentLine++;

                if (line.TrimStart().StartsWith(this.LandMark))
                {
                    //found land mark
                    foundLandMark = true;

                    if (!output.IsCMakeFile)
                    {
                        output.AddLine(PatchCommand.START + " " + this.TaskId);
                    }

                    output.AddLine(line);
                    break;
                }
                else
                {
                    //just add to output
                    output.AddLine(line);
                }
            }

            if (!foundLandMark)
            {
                return;

                throw new NotSupportedException();
            }
            //------------------------------------------------------------
            //do actions...
            int j = commands.Count;

            for (int c = 0; c < j; ++c)
            {
                PatchCommand cmd = commands[c];
                //find start position
                switch (cmd.comandKind)
                {
                case PatchCommandKind.FindNextLandMark:
                {
                    //from current position find next until found
                    curLine = input.CurrentLine;
                    bool foundNextLandMark = false;
                    for (int i = curLine; i < lineCount; ++i)
                    {
                        string line = input.GetLine(i);
                        input.CurrentLine++;

                        if (line.TrimStart().StartsWith(cmd.String))
                        {
                            //found land mark
                            foundNextLandMark = true;
                            AddControlLine(output, cmd);         //***
                            output.AddLine(line);
                            break;
                        }
                        else
                        {
                            //just add to output
                            output.AddLine(line);
                        }
                    }

                    if (!foundNextLandMark)
                    {
                        throw new NotSupportedException("next land mark not found");
                    }
                }
                break;

                case PatchCommandKind.AppendStringStart:
                {
                    AddControlLine(output, cmd);         //***
                }
                break;

                case PatchCommandKind.FollowBy:
                {
                    //just 1 line must match

                    string nextLine = input.GetLine(input.CurrentLine);
                    input.CurrentLine++;

                    if (nextLine.TrimStart().StartsWith(cmd.String))
                    {
                        //match
                        AddControlLine(output, cmd);         //***
                        output.AddLine(nextLine);
                    }
                    else
                    {
                        throw new NotSupportedException();
                    }
                }
                break;

                case PatchCommandKind.SkipUntilPass:
                {
                    curLine = input.CurrentLine;
                    bool foundNextLandMark = false;
                    for (int i = curLine; i < lineCount; ++i)
                    {
                        string line = input.GetLine(i);
                        input.CurrentLine++;

                        if (line.TrimStart().StartsWith(cmd.String))
                        {
                            AddControlLine(output, cmd);         //***
                            //found land mark
                            foundNextLandMark = true;
                            //not add this
                            //just skip
                            break;
                        }
                        else
                        {
                            //skip
                        }
                    }

                    if (!foundNextLandMark)
                    {
                        throw new NotSupportedException("next land mark not found");
                    }
                }
                break;

                case PatchCommandKind.SkipUntilAndAccept:
                {
                    curLine = input.CurrentLine;
                    bool foundNextLandMark = false;
                    for (int i = curLine; i < lineCount; ++i)
                    {
                        string line = input.GetLine(i);
                        input.CurrentLine++;

                        if (line.TrimStart().StartsWith(cmd.String))
                        {
                            //found land mark
                            foundNextLandMark = true;
                            //accept this line
                            AddControlLine(output, cmd);         //***
                            output.AddLine(line);
                            break;
                        }
                        else
                        {
                            //skip
                        }
                    }

                    if (!foundNextLandMark)
                    {
                        throw new NotSupportedException("next land mark not found");
                    }
                }
                break;

                default:
                    throw new NotSupportedException();
                }
            }
        }