public virtual int parseBody(Patch script, int end)
{
byte[] buf = _file.Buffer;
int c = RawParseUtils.nextLF(buf, _startOffset), last = c;
_oldImage.LinesDeleted = 0;
_oldImage.LinesAdded = 0;
for (; c < end; last = c, c = RawParseUtils.nextLF(buf, c))
{
bool breakScan;
switch (buf[c])
{
case (byte)' ':
case (byte)'\n':
LinesContext++;
continue;
case (byte)'-':
_oldImage.LinesDeleted++;
continue;
case (byte)'+':
_oldImage.LinesAdded++;
continue;
case (byte)'\\': // Matches "\ No newline at end of file"
continue;
default:
breakScan = true;
break;
}
if (breakScan)
{
break;
}
}
if (last < end && LinesContext + _oldImage.LinesDeleted - 1 == _oldImage.LineCount
&& LinesContext + _oldImage.LinesAdded == NewLineCount
&& RawParseUtils.match(buf, last, Patch.SigFooter) >= 0)
{
// This is an extremely common occurrence of "corruption".
// Users add footers with their signatures After this mark,
// and git diff adds the git executable version number.
// Let it slide; the hunk otherwise looked sound.
//
_oldImage.LinesDeleted--;
return last;
}
if (LinesContext + _oldImage.LinesDeleted < _oldImage.LineCount)
{
int missingCount = _oldImage.LineCount - (LinesContext + _oldImage.LinesDeleted);
script.error(buf, _startOffset, "Truncated hunk, at least "
+ missingCount + " old lines is missing");
}
else if (LinesContext + _oldImage.LinesAdded < NewLineCount)
{
int missingCount = NewLineCount - (LinesContext + _oldImage.LinesAdded);
script.error(buf, _startOffset, "Truncated hunk, at least "
+ missingCount + " new lines is missing");
}
else if (LinesContext + _oldImage.LinesDeleted > _oldImage.LineCount
|| LinesContext + _oldImage.LinesAdded > NewLineCount)
{
string oldcnt = _oldImage.LineCount + ":" + NewLineCount;
string newcnt = (LinesContext + _oldImage.LinesDeleted) + ":"
+ (LinesContext + _oldImage.LinesAdded);
script.warn(buf, _startOffset, "Hunk header " + oldcnt
+ " does not match body line count of " + newcnt);
}
return c;
}