/// <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); }
public PatchTask FindNext(string landMark) { var cmd = new PatchCommand(this.TaskId, PatchCommandKind.FindNextLandMark, landMark); commands.Add(cmd); return(this); }
public PatchTask FollowBy(string landMark) { var cmd = new PatchCommand(this.TaskId, PatchCommandKind.FollowBy, landMark); commands.Add(cmd); return(this); }
public PatchTask Append(string appendString) { var cmd = new PatchCommand(this.TaskId, PatchCommandKind.AppendStringStart, appendString); commands.Add(cmd); return(this); }
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(); } } }
void AddControlLine(SourceFile outputFile, PatchCommand cmd) { PatchWriter.WriteCommand(outputFile, cmd, false); }
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(); } }
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(); } } }