summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decoder.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decoder.js')
-rw-r--r--testing/web-platform/tests/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decoder.js206
1 files changed, 206 insertions, 0 deletions
diff --git a/testing/web-platform/tests/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decoder.js b/testing/web-platform/tests/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decoder.js
new file mode 100644
index 0000000000..f4bcd863ef
--- /dev/null
+++ b/testing/web-platform/tests/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-decoder.js
@@ -0,0 +1,206 @@
+function dec2char(n) {
+ // converts a decimal number to a Unicode character
+ // n: the dec codepoint value to be converted
+ if (n <= 0xffff) {
+ out = String.fromCharCode(n);
+ } else if (n <= 0x10ffff) {
+ n -= 0x10000;
+ out =
+ String.fromCharCode(0xd800 | (n >> 10)) +
+ String.fromCharCode(0xdc00 | (n & 0x3ff));
+ } else out = "dec2char error: Code point out of range: " + n;
+ return out;
+}
+
+function getIndexPtr(cp, index) {
+ for (p = 0; p < index.length; p++) {
+ if (index[p] == cp) {
+ return p;
+ }
+ }
+ return null;
+}
+
+function iso2022jpDecoder(stream) {
+ stream = stream.replace(/%/g, " ");
+ stream = stream.replace(/[\s]+/g, " ").trim();
+ var bytes = stream.split(" ");
+ for (var i = 0; i < bytes.length; i++) bytes[i] = parseInt(bytes[i], 16);
+ var endofstream = 2000000;
+ //bytes.push(endofstream)
+ var out = "";
+ var decState = "ascii";
+ var outState = "ascii";
+ var isoLead = 0x00;
+ var outFlag = false;
+ var cp, ptr, lead;
+
+ var finished = false;
+ while (!finished) {
+ if (bytes.length == 0) byte = endofstream;
+ else var byte = bytes.shift();
+ //byte = bytes.shift()
+
+ switch (decState) {
+ case "ascii":
+ if (byte == 0x1b) {
+ decState = "escStart";
+ continue;
+ } else if (
+ byte >= 0x00 &&
+ byte <= 0x7f &&
+ byte !== 0x0e &&
+ byte !== 0x0f &&
+ byte !== 0x1b
+ ) {
+ outFlag = false;
+ out += dec2char(byte);
+ continue;
+ } else if (byte == endofstream) {
+ finished = true;
+ continue;
+ } else {
+ outFlag = false;
+ out += "�";
+ continue;
+ }
+ break;
+ case "roman":
+ if (byte == 0x1b) {
+ decState = "escStart";
+ continue;
+ } else if (byte == 0x5c) {
+ outFlag = false;
+ out += dec2char(0xa5);
+ continue;
+ } else if (byte == 0x7e) {
+ outFlag = false;
+ out += dec2char(0x203e);
+ continue;
+ } else if (
+ byte >= 0x00 &&
+ byte <= 0x7f &&
+ byte !== 0x0e &&
+ byte !== 0x0f &&
+ byte !== 0x1b &&
+ byte !== 0x5c &&
+ byte !== 0x7e
+ ) {
+ outFlag = false;
+ out += dec2char(byte);
+ continue;
+ } else if (byte == endofstream) {
+ finished = true;
+ continue;
+ } else {
+ outFlag = false;
+ out += "�";
+ continue;
+ }
+ break;
+ case "katakana":
+ if (byte == 0x1b) {
+ decState = "escStart";
+ continue;
+ } else if (byte >= 0x21 && byte <= 0x5f) {
+ outFlag = false;
+ out += dec2char(0xff61 + byte - 0x21);
+ continue;
+ } else if (byte == endofstream) {
+ finished = true;
+ continue;
+ } else {
+ outFlag = false;
+ out += "�";
+ continue;
+ }
+ break;
+ case "leadbyte":
+ if (byte == 0x1b) {
+ decState = "escStart";
+ continue;
+ } else if (byte >= 0x21 && byte <= 0x7e) {
+ outFlag = false;
+ isoLead = byte;
+ decState = "trailbyte";
+ continue;
+ } else if (byte == endofstream) {
+ finished = true;
+ continue;
+ } else {
+ outFlag = false;
+ out += "�";
+ continue;
+ }
+ break;
+ case "trailbyte":
+ if (byte == 0x1b) {
+ decState = "escStart";
+ out += "�";
+ continue;
+ } else if (byte >= 0x21 && byte <= 0x7e) {
+ decState = "leadbyte";
+ ptr = (isoLead - 0x21) * 94 + byte - 0x21;
+ cp = jis0208[ptr];
+ if (cp == null) {
+ out += "�";
+ continue;
+ }
+ out += dec2char(cp);
+ continue;
+ } else if (byte == endofstream) {
+ decState = "leadbyte";
+ bytes.unshift(byte);
+ out += "�";
+ continue;
+ } else {
+ decState = "leadbyte";
+ out += "�";
+ continue;
+ }
+ break;
+ case "escStart":
+ if (byte == 0x24 || byte == 0x28) {
+ isoLead = byte;
+ decState = "escape";
+ continue;
+ } else {
+ bytes.unshift(byte);
+ outFlag = false;
+ decState = outState;
+ out += "�";
+ continue;
+ }
+ break;
+ case "escape":
+ lead = isoLead;
+ isoLead = 0x00;
+ var state = null;
+ if (lead == 0x28 && byte == 0x42) state = "ascii";
+ if (lead == 0x28 && byte == 0x4a) state = "roman";
+ if (lead == 0x28 && byte == 0x49) state = "katakana";
+ if (lead == 0x24 && (byte == 0x40 || byte == 0x42))
+ state = "leadbyte";
+ if (state != null) {
+ decState = state;
+ outState = state;
+ var outputflag = false;
+ outputflag = outFlag;
+ outFlag = true;
+ if (outputflag == false) continue;
+ else {
+ out += "�";
+ continue;
+ }
+ }
+ // Prepend the sequence (lead, byte) to the stream
+ bytes.unshift(lead, byte);
+ outFlag = false;
+ decState = outState;
+ out += "�";
+ continue;
+ break;
+ }
+ }
+ return out;
+}