From 0df5b4cad2c2af73457101cf11ee9737d49a00b2 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Mon, 11 Mar 2013 20:32:25 +0100 Subject: [PATCH] polyline: Improved decoding loops to be more robust --- src/ol/parser/polyline.js | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/ol/parser/polyline.js b/src/ol/parser/polyline.js index 615ec24062..b2a1de6789 100644 --- a/src/ol/parser/polyline.js +++ b/src/ol/parser/polyline.js @@ -213,19 +213,22 @@ ol.parser.polyline.encodeUnsignedIntegers = function(numbers) { ol.parser.polyline.decodeUnsignedIntegers = function(encoded) { var numbers = new Array(); + var current = 0; + var shift = 0; + var encodedLength = encoded.length; - for (var i = 0; i < encodedLength;) { - var result = 0; - var shift = 0; + for (var i = 0; i < encodedLength; ++i) { + var b = encoded.charCodeAt(i) - 63; - var b; - do { - b = encoded.charCodeAt(i++) - 63; - result |= (b & 0x1f) << shift; + current |= (b & 0x1f) << shift; + + if (b < 0x20) { + numbers.push(current); + current = 0; + shift = 0; + } else { shift += 5; - } while (b >= 0x20); - - numbers.push(result); + } } return numbers; @@ -316,12 +319,17 @@ ol.parser.polyline.decodeUnsignedInteger = function(encoded) { var result = 0; var shift = 0; - var b, i = 0; - do { - b = encoded.charCodeAt(i++) - 63; + var encodedLength = encoded.length; + for (var i = 0; i < encodedLength; ++i) { + var b = encoded.charCodeAt(i) - 63; + result |= (b & 0x1f) << shift; + + if (b < 0x20) + break; + shift += 5; - } while (b >= 0x20); + } return result; };