diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-07-14 20:40:32 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-07-14 20:40:32 -0700 |
commit | 5fd21fc62fd407517ddfb0da706f7fcb757cf1be (patch) | |
tree | fe8a5ef761183cd77128b584ba96624fa724d6b0 | |
parent | 4ffb769331329f8997d3597854cabe4e109e8684 (diff) |
refactor utf8processing
-rw-r--r-- | src/library.js | 35 | ||||
-rw-r--r-- | src/runtime.js | 34 |
2 files changed, 36 insertions, 33 deletions
diff --git a/src/library.js b/src/library.js index a763bd9c..002a93a6 100644 --- a/src/library.js +++ b/src/library.js @@ -367,44 +367,13 @@ LibraryManager.library = { return input.cache.shift(); }; } - - var utf8Buffer = []; - var utf8Needed = 0; - function utf8Processor(code) { - code = code & 0xff; - if (utf8Needed) { - utf8Buffer.push(code); - utf8Needed--; - } - if (utf8Buffer.length == 0) { - if (code < 128) return String.fromCharCode(code); - utf8Buffer.push(code); - if (code > 191 && code < 224) { - utf8Needed = 1; - } else { - utf8Needed = 2; - } - return ''; - } - if (utf8Needed > 0) return ''; - var c1 = utf8Buffer[0]; - var c2 = utf8Buffer[1]; - var c3 = utf8Buffer[2]; - var ret; - if (c1 > 191 && c1 < 224) { - ret = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); - } else { - ret = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - } - utf8Buffer.length = 0; - return ret; - } + var utf8 = new Runtime.UTF8Processor(); function simpleOutput(val) { if (val === null || val === '\n'.charCodeAt(0)) { output.printer(output.buffer.join('')); output.buffer = []; } else { - output.buffer.push(utf8Processor(val)); + output.buffer.push(utf8.feed(val)); } } if (!output) { diff --git a/src/runtime.js b/src/runtime.js index 1f8a618f..e39fa61e 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -334,6 +334,40 @@ var Runtime = { return Runtime.funcWrappers[func]; }, + UTF8Processor: function() { + var buffer = []; + var needed = 0; + this.feed = function (code) { + code = code & 0xff; + if (needed) { + buffer.push(code); + needed--; + } + if (buffer.length == 0) { + if (code < 128) return String.fromCharCode(code); + buffer.push(code); + if (code > 191 && code < 224) { + needed = 1; + } else { + needed = 2; + } + return ''; + } + if (needed > 0) return ''; + var c1 = buffer[0]; + var c2 = buffer[1]; + var c3 = buffer[2]; + var ret; + if (c1 > 191 && c1 < 224) { + ret = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); + } else { + ret = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + } + buffer.length = 0; + return ret; + } + }, + #if RUNTIME_DEBUG debug: true, // Switch to false at runtime to disable logging at the right times |