summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/encoding/legacy-mb-japanese/euc-jp/eucjp-decoder.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/encoding/legacy-mb-japanese/euc-jp/eucjp-decoder.js')
-rw-r--r--testing/web-platform/tests/encoding/legacy-mb-japanese/euc-jp/eucjp-decoder.js85
1 files changed, 85 insertions, 0 deletions
diff --git a/testing/web-platform/tests/encoding/legacy-mb-japanese/euc-jp/eucjp-decoder.js b/testing/web-platform/tests/encoding/legacy-mb-japanese/euc-jp/eucjp-decoder.js
new file mode 100644
index 0000000000..e1fe01df11
--- /dev/null
+++ b/testing/web-platform/tests/encoding/legacy-mb-japanese/euc-jp/eucjp-decoder.js
@@ -0,0 +1,85 @@
+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 eucjpDecoder(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 out = "";
+
+ var lead, byte, offset, ptr, cp;
+ var jis0212flag = false;
+ var eucjpLead = 0x00;
+ var endofstream = 2000000;
+ var finished = false;
+
+ while (!finished) {
+ if (bytes.length == 0) byte = endofstream;
+ else byte = bytes.shift();
+
+ if (byte == endofstream && eucjpLead != 0x00) {
+ eucjpLead = 0x00;
+ out += "�";
+ continue;
+ }
+ if (byte == endofstream && eucjpLead == 0x00) {
+ finished = true;
+ continue;
+ }
+ if (eucjpLead == 0x8e && byte >= 0xa1 && byte <= 0xdf) {
+ eucjpLead = 0x00;
+ out += dec2char(0xff61 + byte - 0xa1);
+ continue;
+ }
+ if (eucjpLead == 0x8f && byte >= 0xa1 && byte <= 0xfe) {
+ jis0212flag = true;
+ eucjpLead = byte;
+ continue;
+ }
+ if (eucjpLead != 0x00) {
+ lead = eucjpLead;
+ eucjpLead = 0x00;
+ cp = null;
+
+ if (
+ lead >= 0xa1 &&
+ lead <= 0xfe &&
+ (byte >= 0xa1 && byte <= 0xfe)
+ ) {
+ ptr = (lead - 0xa1) * 94 + byte - 0xa1;
+ if (jis0212flag) cp = jis0212[ptr];
+ else cp = jis0208[ptr];
+ }
+ jis0212flag = false;
+ if (cp != null) {
+ out += dec2char(cp);
+ continue;
+ }
+ if (byte >= 0x00 && byte <= 0x7f) bytes.unshift(byte);
+ out += "�";
+ continue;
+ }
+ if (byte >= 0x00 && byte <= 0x7f) {
+ out += dec2char(byte);
+ continue;
+ }
+ if (byte == 0x8e || byte == 0x8f || (byte >= 0xa1 && byte <= 0xfe)) {
+ eucjpLead = byte;
+ continue;
+ }
+ out += "�";
+ }
+ return out;
+}