git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[JGIT PATCH 1/6] Simplify RawParseUtils.nextLF invocations

From
Shawn O. Pearce <spearce@spearce.org>
Date
Dec 10, 2008, 22:05 UTC
Message-ID
<1228946751-12708-2-git-send-email-spearce@spearce.org>
In-Reply-To
<1228946751-12708-1-git-send-email-spearce@spearce.org>

Most of the time when we call next('\n') or nextLF('\n') we really meant to just say nextLF(), which is logically identical to next() but could be micro-optimized for the LF byte.

This refactoring shifts the calls to use the new nextLF wrapper for next('\n'), so we can later chose to make this optimization, or to leave the code as-is. But either way the call sites are now much clearer to read.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../src/org/spearce/jgit/lib/ObjectChecker.java    |    4 +-
 .../src/org/spearce/jgit/revwalk/RevTag.java       |    2 +-
 .../src/org/spearce/jgit/util/RawParseUtils.java   |   25 ++++++++++++++++----
 3 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectChecker.java b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectChecker.java
index b303d6f..75e3c77 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectChecker.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectChecker.java
@@ -205,11 +205,11 @@ public void checkTag(final byte[] raw) throws CorruptObjectException {
 
 		if ((ptr = match(raw, ptr, type)) < 0)
 			throw new CorruptObjectException("no type header");
-		ptr = nextLF(raw, ptr, '\n');
+		ptr = nextLF(raw, ptr);
 
 		if ((ptr = match(raw, ptr, tag)) < 0)
 			throw new CorruptObjectException("no tag header");
-		ptr = nextLF(raw, ptr, '\n');
+		ptr = nextLF(raw, ptr);
 
 		if ((ptr = match(raw, ptr, tagger)) < 0)
 			throw new CorruptObjectException("no tagger header");
diff --git a/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevTag.java b/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevTag.java
index bbb18ee..77a55cd 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevTag.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevTag.java
@@ -90,7 +90,7 @@ void parseCanonical(final RevWalk walk, final byte[] rawTag)
 		object = walk.lookupAny(walk.idBuffer, oType);
 
 		int p = pos.value += 4; // "tag "
-		final int nameEnd = RawParseUtils.next(rawTag, p, '\n') - 1;
+		final int nameEnd = RawParseUtils.nextLF(rawTag, p) - 1;
 		name = RawParseUtils.decode(Constants.CHARSET, rawTag, p, nameEnd);
 		buffer = rawTag;
 		flags |= PARSED;
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 4b96439..10c2239 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/util/RawParseUtils.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/util/RawParseUtils.java
@@ -230,6 +230,21 @@ public static final int next(final byte[] b, int ptr, final char chrA) {
 	}
 
 	/**
+	 * Locate the first position after the next 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 after the first LF found.
+	 */
+	public static final int nextLF(final byte[] b, int ptr) {
+		return next(b, ptr, '\n');
+	}
+
+	/**
 	 * Locate the first position after either the given character or LF.
 	 * <p>
 	 * This method stops on the first match it finds from either chrA or '\n'.
@@ -296,7 +311,7 @@ public static final int committer(final byte[] b, int ptr) {
 		while (ptr < sz && b[ptr] == 'p')
 			ptr += 48; // skip this parent.
 		if (ptr < sz && b[ptr] == 'a')
-			ptr = next(b, ptr, '\n');
+			ptr = nextLF(b, ptr);
 		return match(b, ptr, committer);
 	}
 
@@ -320,7 +335,7 @@ public static final int encoding(final byte[] b, int ptr) {
 				return -1;
 			if (b[ptr] == 'e')
 				break;
-			ptr = next(b, ptr, '\n');
+			ptr = nextLF(b, ptr);
 		}
 		return match(b, ptr, encoding);
 	}
@@ -342,7 +357,7 @@ public static Charset parseEncoding(final byte[] b) {
 		final int enc = encoding(b, 0);
 		if (enc < 0)
 			return Constants.CHARSET;
-		final int lf = next(b, enc, '\n');
+		final int lf = nextLF(b, enc);
 		return Charset.forName(decode(Constants.CHARSET, b, enc, lf - 1));
 	}
 
@@ -505,7 +520,7 @@ public static final int commitMessage(final byte[] b, int ptr) {
 		// header line type is.
 		//
 		while (ptr < sz && b[ptr] != '\n')
-			ptr = next(b, ptr, '\n');
+			ptr = nextLF(b, ptr);
 		if (ptr < sz && b[ptr] == '\n')
 			return ptr + 1;
 		return -1;
@@ -529,7 +544,7 @@ public static final int endOfParagraph(final byte[] b, final int start) {
 		int ptr = start;
 		final int sz = b.length;
 		while (ptr < sz && b[ptr] != '\n')
-			ptr = next(b, ptr, '\n');
+			ptr = nextLF(b, ptr);
 		while (0 < ptr && start < ptr && b[ptr - 1] == '\n')
 			ptr--;
 		return ptr;
-- 
1.6.1.rc2.299.gead4c
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 2 of 11 in “RawParseUtil improvements”
  1. 0/6 RawParseUtil improvementsShawn O. Pearce, Dec 10, 2008
  2. 1/6 Simplify RawParseUtils.nextLF invocationsShawn O. Pearce, Dec 10, 2008
  3. 2/6 Simplify RawParseUtils next and nextLF loopsShawn O. Pearce, Dec 10, 2008
  4. 3/6 Correct Javadoc of RawParseUtils next and nextLF methodsShawn O. Pearce, Dec 10, 2008
  5. 4/6 Add QuotedString class to handle C-style quoting rulesShawn O. Pearce, Dec 10, 2008
  6. 5/6 Add Bourne style quoting for TransportGitSshShawn O. Pearce, Dec 10, 2008
  7. 6/6 Add ~user friendly Bourne style quoting for TransportGitSshShawn O. Pearce, Dec 10, 2008
  8. Robin RosenbergDec 10, 2008
  9. Shawn O. PearceDec 10, 2008
  10. Robin RosenbergDec 11, 2008
  11. 4/6 Add QuotedString class to handle Git path style quoting rulesShawn O. Pearce, Dec 11, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.