comparison src/org/tmatesoft/hg/core/Nodeid.java @ 266:0a2f445de774

Improve manifest parsing: reduce number of arrays instantiated for Nodeid
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Fri, 19 Aug 2011 04:59:32 +0200
parents 3dcd3dd90c77
children 88c58edc0857
comparison
equal deleted inserted replaced
265:3dd953c65619 266:0a2f445de774
17 package org.tmatesoft.hg.core; 17 package org.tmatesoft.hg.core;
18 18
19 import static org.tmatesoft.hg.internal.DigestHelper.toHexString; 19 import static org.tmatesoft.hg.internal.DigestHelper.toHexString;
20 20
21 import java.util.Arrays; 21 import java.util.Arrays;
22
23 import org.tmatesoft.hg.internal.DigestHelper;
22 24
23 25
24 26
25 /** 27 /**
26 * A 20-bytes (40 characters) long hash value to identify a revision. 28 * A 20-bytes (40 characters) long hash value to identify a revision.
172 public static Nodeid fromAscii(byte[] asciiRepresentation, int offset, int length) { 174 public static Nodeid fromAscii(byte[] asciiRepresentation, int offset, int length) {
173 if (length != 40) { 175 if (length != 40) {
174 throw new IllegalArgumentException(); 176 throw new IllegalArgumentException();
175 } 177 }
176 byte[] data = new byte[20]; 178 byte[] data = new byte[20];
177 boolean zeroBytes = true; 179 boolean zeroBytes = DigestHelper.ascii2bin(asciiRepresentation, offset, length, data);
178 for (int i = 0, j = offset; i < data.length; i++) {
179 int b = asciiRepresentation[j++] & 0xCF; // -0x30 to get decimal digit out from their char, and to uppercase if a letter
180 int hiNibble = b > 64 ? b - 55 : b;
181 b = asciiRepresentation[j++] & 0xCF;
182 int lowNibble = b > 64 ? b - 55 : b;
183 if (hiNibble >= 16 || lowNibble >= 16) {
184 throw new IllegalArgumentException(String.format("Characters '%c%c' (%1$d and %2$d) at index %d are not valid hex digits", asciiRepresentation[j-2], asciiRepresentation[j-1], j-2));
185 }
186 b = (((hiNibble << 4) | lowNibble) & 0xFF);
187 data[i] = (byte) b;
188 zeroBytes = zeroBytes && b == 0;
189 }
190 if (zeroBytes) { 180 if (zeroBytes) {
191 return NULL; 181 return NULL;
192 } 182 }
193 return new Nodeid(data, false); 183 return new Nodeid(data, false);
194 } 184 }