forked from henon/GitSharp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ByteArrayExtensions.cs
91 lines (77 loc) · 2.52 KB
/
ByteArrayExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System;
namespace GitSharp.Core
{
public static class ByteArrayExtensions
{
public class ParsedLine
{
public int NextIndex { get; private set;}
public byte[] Buffer { get; private set; }
public ParsedLine(int nextIndex, byte[] buffer)
{
NextIndex = nextIndex;
Buffer = buffer;
}
}
public static bool StartsWith(this byte[] buffer, byte[] bufferToCompareWith)
{
if (buffer == null)
{
throw new ArgumentNullException("buffer");
}
if (bufferToCompareWith == null)
{
throw new ArgumentNullException("bufferToCompareWith");
}
if (buffer.Length < bufferToCompareWith.Length)
{
return false;
}
int curpos = -1;
while (++curpos < bufferToCompareWith.Length)
{
if (bufferToCompareWith[curpos] != buffer[curpos])
{
return false;
}
}
return true;
}
public static ParsedLine ReadLine(this byte[] source, int startIndex)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (startIndex < 0)
{
throw new ArgumentOutOfRangeException("startIndex", "Parameter is expected gretaer or equal than zero.");
}
if (startIndex >= source.Length)
{
return new ParsedLine(-1, null);
}
int currentIndex = startIndex - 1;
int indexModifier = 0;
while (indexModifier == 0 && ++currentIndex < source.Length)
{
int num = source[currentIndex];
switch (num)
{
case 13:
if ((currentIndex != (source.Length - 1)) && (source[currentIndex + 1] == 10))
{
indexModifier = 2;
}
break;
case 10:
indexModifier = 1;
break;
}
}
var output = new byte[currentIndex - startIndex];
Array.Copy(source, startIndex, output, 0, currentIndex - startIndex);
return new ParsedLine (currentIndex + indexModifier, output);
}
}
}