• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1var sjisCPs = []; // index is unicode cp, value is pointer
2for (var p = 0; p < 8272; p++) {
3	if (jis0208[p] != null && sjisCPs[jis0208[p]] == null) {
4		sjisCPs[jis0208[p]] = p;
5	}
6}
7for (p = 8836; p < jis0208.length; p++) {
8	if (jis0208[p] != null && sjisCPs[jis0208[p]] == null) {
9		sjisCPs[jis0208[p]] = p;
10	}
11}
12
13function chars2cps(chars) {
14	// this is needed because of javascript's handling of supplementary characters
15	// char: a string of unicode characters
16	// returns an array of decimal code point values
17	var haut = 0;
18	var out = [];
19	for (var i = 0; i < chars.length; i++) {
20		var b = chars.charCodeAt(i);
21		if (b < 0 || b > 0xffff) {
22			alert("Error in chars2cps: byte out of range " + b.toString(16) + "!");
23		}
24		if (haut != 0) {
25			if (0xdc00 <= b && b <= 0xdfff) {
26				out.push(0x10000 + ((haut - 0xd800) << 10) + (b - 0xdc00));
27				haut = 0;
28				continue;
29			} else {
30				alert(
31					"Error in chars2cps: surrogate out of range " +
32						haut.toString(16) +
33						"!"
34				);
35				haut = 0;
36			}
37		}
38		if (0xd800 <= b && b <= 0xdbff) {
39			haut = b;
40		} else {
41			out.push(b);
42		}
43	}
44	return out;
45}
46
47function sjisEncoder(stream) {
48	var cps = chars2cps(stream);
49	var out = "";
50	var cp;
51	var finished = false;
52	var endofstream = 2000000;
53	var temp, offset, leadoffset, first, second;
54	while (!finished) {
55		if (cps.length == 0) cp = endofstream;
56		else cp = cps.shift();
57
58		if (cp == endofstream) {
59			finished = true;
60			continue;
61		}
62		if ((cp >= 0x00 && cp <= 0x7f) || cp == 0x80) {
63			out += " " + cp.toString(16).toUpperCase();
64			continue;
65		}
66		if (cp == 0xa5) {
67			out += " 5C";
68			continue;
69		}
70		if (cp == 0x203e) {
71			out += " 7E";
72			continue;
73		}
74		if (cp >= 0xff61 && cp <= 0xff9f) {
75			temp = cp - 0xff61 + 0xa1;
76			out += " " + temp.toString(16).toUpperCase();
77			continue;
78		}
79		if (cp == 0x2212) {
80			cp = 0xff0d;
81		}
82		var ptr = sjisCPs[cp];
83		if (ptr == null) {
84			return null;
85			//			out += ' &#'+cp+';'
86			//			continue
87		}
88		var lead = Math.floor(ptr / 188);
89		if (lead < 0x1f) leadoffset = 0x81;
90		else leadoffset = 0xc1;
91		var trail = ptr % 188;
92		first = lead + leadoffset;
93		if (trail < 0x3f) offset = 0x40;
94		else offset = 0x41;
95		second = trail + offset;
96		out +=
97			" " +
98			first.toString(16).toUpperCase() +
99			" " +
100			second.toString(16).toUpperCase();
101	}
102	return out.trim();
103}
104
105function convertToHex(str) {
106	// converts a string of ASCII characters to hex byte codes
107	var out = "";
108	var result;
109	for (var c = 0; c < str.length; c++) {
110		result = str.charCodeAt(c).toString(16).toUpperCase() + " ";
111		out += result;
112	}
113	return out;
114}
115
116function normalizeStr(str) {
117	var out = "";
118	for (var c = 0; c < str.length; c++) {
119		if (str.charAt(c) == "%") {
120			out += String.fromCodePoint(
121				parseInt(str.charAt(c + 1) + str.charAt(c + 2), 16)
122			);
123			c += 2;
124		} else out += str.charAt(c);
125	}
126	var result = "";
127	for (var o = 0; o < out.length; o++) {
128		result += "%" + out.charCodeAt(o).toString(16).toUpperCase();
129	}
130	return result.replace(/%1B%28%42$/, "");
131}
132