[EGIT PATCH 2/3] Add methods to RawParseUtils for scanning backwards.
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
.../src/org/spearce/jgit/util/RawParseUtils.java | 84 +++++++++++++++++++-
1 files changed, 83 insertions(+), 1 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/util/RawParseUtils.java b/org.spearce.jgit/src/org/spearce/jgit/util/RawParseUtils.java
index 79ebe41..bdd6a11 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/util/RawParseUtils.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/util/RawParseUtils.java
@@ -321,6 +321,67 @@ public static final int nextLF(final byte[] b, int ptr, final char chrA) {
}
/**
+ * Locate the first position before a given character.
+ *
+ * @param b
+ * buffer to scan.
+ * @param ptr
+ * position within buffer to start looking for chrA at.
+ * @param chrA
+ * character to find.
+ * @return new position just before chrA, -1 for not found
+ */
+ public static final int prev(final byte[] b, int ptr, final char chrA) {
+ if (ptr == b.length)
+ --ptr;
+ while (ptr >= 0) {
+ if (b[ptr--] == chrA)
+ return ptr;
+ }
+ return ptr;
+ }
+
+ /**
+ * Locate the first position before the previous LF.
+ * <p>
+ * This method stops on the first '\n' it finds.
+ *
+ * @param b
+ * buffer to scan.
+ * @param ptr
+ * position within buffer to start looking for LF at.
+ * @return new position just before the first LF found, -1 for not found
+ */
+ public static final int prevLF(final byte[] b, int ptr) {
+ return prev(b, ptr, '\n');
+ }
+
+ /**
+ * Locate the previous position before either the given character or LF.
+ * <p>
+ * This method stops on the first match it finds from either chrA or '\n'.
+ *
+ * @param b
+ * buffer to scan.
+ * @param ptr
+ * position within buffer to start looking for chrA or LF at.
+ * @param chrA
+ * character to find.
+ * @return new position just before the first chrA or LF to be found, -1 for
+ * not found
+ */
+ public static final int prevLF(final byte[] b, int ptr, final char chrA) {
+ if (ptr == b.length)
+ --ptr;
+ while (ptr >= 0) {
+ final byte c = b[ptr--];
+ if (c == chrA || c == '\n')
+ return ptr;
+ }
+ return ptr;
+ }
+
+ /**
* Index the region between <code>[ptr, end)</code> to find line starts.
* <p>
* The returned list is 1 indexed. Index 0 contains
@@ -519,7 +580,28 @@ public static PersonIdent parsePersonIdent(final byte[] raw, final int nameB) {
* after decoding the region through the specified character set.
*/
public static String decode(final byte[] buffer) {
- return decode(Constants.CHARSET, buffer, 0, buffer.length);
+ return decode(buffer, 0, buffer.length);
+ }
+
+ /**
+ * Decode a buffer under UTF-8, if possible.
+ *
+ * If the byte stream cannot be decoded that way, the platform default is
+ * tried and if that too fails, the fail-safe ISO-8859-1 encoding is tried.
+ *
+ * @param buffer
+ * buffer to pull raw bytes from.
+ * @param start
+ * start position in buffer
+ * @param end
+ * one position past the last location within the buffer to take
+ * data from.
+ * @return a string representation of the range <code>[start,end)</code>,
+ * after decoding the region through the specified character set.
+ */
+ public static String decode(final byte[] buffer, final int start,
+ final int end) {
+ return decode(Constants.CHARSET, buffer, start, end);
}
/**
--
1.6.3.2.199.g7340d