Comparing version 1.0.5 to 1.0.6
105
index.js
@@ -58,46 +58,35 @@ 'use strict'; | ||
const two = (byteA, byteB) => { | ||
const two = (bytes) => { | ||
return ( | ||
(byteA & 0xE0) === 0xC0 && | ||
(byteA & 0xFE) !== 0xC0 && // C2..DF | ||
(byteB & 0xC0) === 0x80 // 80..BF | ||
(bytes & 0xE0C0) === 0xC080 && | ||
(bytes & 0xFE00) !== 0xC000 // C2..DF 80..BF | ||
); | ||
}; | ||
const three = (byteA, byteB, byteC) => { | ||
const three = (bytes) => { | ||
return ( | ||
( | ||
byteA === 0xE0 && // E0 | ||
(byteB & 0xE0) === 0xA0 || // A0..BF | ||
(bytes & 0xFFE0C0) === 0xE0A080 || // E0 A0..BF 80..BF | ||
(byteA & 0xF0) === 0xE0 && | ||
byteA !== 0xE0 && | ||
byteA !== 0xED && // E1..EC, EE, EF | ||
(byteB & 0xC0) === 0x80 || // 80..BF | ||
(bytes & 0xF0C0C0) === 0xE08080 && | ||
(bytes & 0xFF0000) !== 0xE00000 && | ||
(bytes & 0xFF0000) !== 0xED0000 || // E1..EC | EE | EF 2*(80..BF) | ||
byteA === 0xED && // ED | ||
(byteB & 0xE0) === 0x80 // 80..9F | ||
) && | ||
(byteC & 0xC0) === 0x80 // 80..BF | ||
(bytes & 0xFFE0C0) === 0xED8080 // ED 80..9F 80..BF | ||
); | ||
}; | ||
const four = (byteA, byteB, byteC, byteD) => { | ||
const four = (bytes) => { | ||
return ( | ||
( | ||
(byteA === 0xF0 && // F0 | ||
(byteB & 0xF0) !== 0x80 || // 80..BF | ||
(bytes & 0xFFC0C0C0) >>> 0 === 0xF0808080 && | ||
(bytes & 0xF00000) !== 0x800000 || // F0 90..BF 2*(80..BF) | ||
(byteA & 0xFC) === 0xF0 && | ||
(byteA & 0x03) !== 0x00 // F1..F3 | ||
) && | ||
(byteB & 0xC0) === 0x80 || // 80..BF | ||
(bytes & 0xFCC0C0C0) >>> 0 === 0xF0808080 && | ||
(bytes & 0x03000000) >>> 0 !== 0x00 // F1..F3 3*(80..BF) | ||
) || | ||
byteA === 0xF4 && // F4 | ||
(byteB & 0xF0) === 0x80) && // 80..8F | ||
(byteC & 0xC0) === 0x80 && // 80..BF | ||
(byteD & 0xC0) === 0x80 // 80..BF | ||
(bytes & 0xFFF0C0C0) >>> 0 === 0xF4808080 // F4 80..8F 2*(80..BF) | ||
); | ||
@@ -111,14 +100,20 @@ }; | ||
const validTwo = (byteA, byteB) => { | ||
const validTwo = (bytes) => { | ||
return (one(byteA) && one(byteB) || two(byteA, byteB)); | ||
return (((bytes & 0x8080) === 0) || two(bytes)); | ||
}; | ||
const validThree = (byteA, byteB, byteC) => { | ||
const validThree = (bytes) => { | ||
return ( | ||
one(byteA) && one(byteB) && one(byteC) || | ||
one(byteA) && two(byteB, byteC) || | ||
two(byteA, byteB) && one(byteC) || | ||
three(byteA, byteB, byteC) | ||
((bytes & 0x808080) === 0) || | ||
( | ||
(bytes & 0x80E0C0) === 0x00C080 && | ||
(bytes & 0xFE00) !== 0xC000 | ||
) || | ||
( | ||
(bytes & 0xE0C080) === 0xC08000 && | ||
(bytes & 0xFE0000) !== 0xC00000 | ||
) || | ||
three(bytes) | ||
); | ||
@@ -133,5 +128,5 @@ }; | ||
let byteA = 0; | ||
let byteB = 0; | ||
let byteC = 0; | ||
let byteD = 0; | ||
let byteAB = 0; | ||
let byteABC = 0; | ||
let byteABCD = 0; | ||
@@ -143,7 +138,7 @@ let index = 0; | ||
// Read next 4 bytes | ||
// Read next 4 bytes as uint32 values | ||
byteA = buffer[index]; | ||
byteB = buffer[index + 1]; | ||
byteC = buffer[index + 2]; | ||
byteD = buffer[index + 3]; | ||
byteAB = (byteA << 8) | buffer[index + 1]; | ||
byteABC = (byteAB << 8) | buffer[index + 2]; | ||
byteABCD = ((byteABC << 8) | buffer[index + 3]) >>> 0; | ||
@@ -154,7 +149,7 @@ // Check for one byte character | ||
// Optimize for reading the next 3 bytes | ||
if (validThree(byteB, byteC, byteD)) { | ||
if (validThree(byteABCD)) { | ||
index += 4; | ||
} else if (validTwo(byteB, byteC)) { | ||
} else if (validTwo(byteABC)) { | ||
index += 3; | ||
} else if (validOne(byteB)) { | ||
} else if (validOne(byteAB)) { | ||
index += 2; | ||
@@ -166,8 +161,8 @@ } else { | ||
// Check for 2 bytes sequence | ||
} else if (two(byteA, byteB)) { | ||
} else if (two(byteAB)) { | ||
// Optimize for reading the next 2 bytes | ||
if (validTwo(byteC, byteD)) { | ||
if (validTwo(byteABCD)) { | ||
index += 4; | ||
} else if (validOne(byteC)) { | ||
} else if (validOne(byteABC)) { | ||
index += 3; | ||
@@ -179,6 +174,6 @@ } else { | ||
// Check for 3 bytes sequence | ||
} else if (three(byteA, byteB, byteC)) { | ||
} else if (three(byteABC)) { | ||
// Optimize for reading the next byte | ||
if (validOne(byteD)) { | ||
if (validOne(byteABCD)) { | ||
index += 4; | ||
@@ -190,3 +185,3 @@ } else { | ||
// Check for 4 bytes sequence | ||
} else if (four(byteA, byteB, byteC, byteD)) { | ||
} else if (four(byteABCD)) { | ||
index += 4; | ||
@@ -212,5 +207,5 @@ } else { | ||
byteA = buffer[index]; | ||
byteB = buffer[index + 1]; | ||
byteAB = (byteA << 8) | buffer[index + 1]; | ||
return validTwo(byteA, byteB); | ||
return validTwo(byteAB); | ||
} else { | ||
@@ -220,6 +215,6 @@ | ||
byteA = buffer[index]; | ||
byteB = buffer[index + 1]; | ||
byteC = buffer[index + 2]; | ||
byteAB = (byteA << 8) | buffer[index + 1]; | ||
byteABC = (byteAB << 8) | buffer[index + 2]; | ||
return validThree(byteA, byteB, byteC); | ||
return validThree(byteABC); | ||
} | ||
@@ -226,0 +221,0 @@ } |
{ | ||
"name": "uv", | ||
"version": "1.0.5", | ||
"version": "1.0.6", | ||
"description": "Ultrafast UTF-8 data validation", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -33,3 +33,3 @@ 'use strict'; | ||
if (uv(buffer) !== isUtf8Valid) { | ||
if (uv(buffer) !== isUtf8Valid) {console.log(buffer); | ||
test.fail('All provided buffers must return the same result as Buffer.compare() method'); | ||
@@ -36,0 +36,0 @@ failed = true; |
@@ -137,2 +137,6 @@ let content = Buffer.alloc(0); | ||
content = Buffer.from(Array.from(Array(16777216)).map(() => Math.floor(Math.random() * 127))); | ||
console.log(uv(content), isValidUTF8(content)); | ||
// add tests | ||
@@ -139,0 +143,0 @@ suite |
16204
8
343