• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1function dec2char(n) {
2    // converts a decimal number to a Unicode character
3    // n: the dec codepoint value to be converted
4    if (n <= 0xffff) {
5        out = String.fromCharCode(n);
6    } else if (n <= 0x10ffff) {
7        n -= 0x10000;
8        out =
9            String.fromCharCode(0xd800 | (n >> 10)) +
10            String.fromCharCode(0xdc00 | (n & 0x3ff));
11    } else out = "dec2char error: Code point out of range: " + n;
12    return out;
13}
14
15function getIndexPtr(cp, index) {
16    for (p = 0; p < index.length; p++) {
17        if (index[p] == cp) {
18            return p;
19        }
20    }
21    return null;
22}
23
24function iso2022jpDecoder(stream) {
25    stream = stream.replace(/%/g, " ");
26    stream = stream.replace(/[\s]+/g, " ").trim();
27    var bytes = stream.split(" ");
28    for (var i = 0; i < bytes.length; i++) bytes[i] = parseInt(bytes[i], 16);
29    var endofstream = 2000000;
30    //bytes.push(endofstream)
31    var out = "";
32    var decState = "ascii";
33    var outState = "ascii";
34    var isoLead = 0x00;
35    var outFlag = false;
36    var cp, ptr, lead;
37
38    var finished = false;
39    while (!finished) {
40        if (bytes.length == 0) byte = endofstream;
41        else var byte = bytes.shift();
42        //byte = bytes.shift()
43
44        switch (decState) {
45            case "ascii":
46                if (byte == 0x1b) {
47                    decState = "escStart";
48                    continue;
49                } else if (
50                    byte >= 0x00 &&
51                    byte <= 0x7f &&
52                    byte !== 0x0e &&
53                    byte !== 0x0f &&
54                    byte !== 0x1b
55                ) {
56                    outFlag = false;
57                    out += dec2char(byte);
58                    continue;
59                } else if (byte == endofstream) {
60                    finished = true;
61                    continue;
62                } else {
63                    outFlag = false;
64                    out += "�";
65                    continue;
66                }
67                break;
68            case "roman":
69                if (byte == 0x1b) {
70                    decState = "escStart";
71                    continue;
72                } else if (byte == 0x5c) {
73                    outFlag = false;
74                    out += dec2char(0xa5);
75                    continue;
76                } else if (byte == 0x7e) {
77                    outFlag = false;
78                    out += dec2char(0x203e);
79                    continue;
80                } else if (
81                    byte >= 0x00 &&
82                    byte <= 0x7f &&
83                    byte !== 0x0e &&
84                    byte !== 0x0f &&
85                    byte !== 0x1b &&
86                    byte !== 0x5c &&
87                    byte !== 0x7e
88                ) {
89                    outFlag = false;
90                    out += dec2char(byte);
91                    continue;
92                } else if (byte == endofstream) {
93                    finished = true;
94                    continue;
95                } else {
96                    outFlag = false;
97                    out += "�";
98                    continue;
99                }
100                break;
101            case "katakana":
102                if (byte == 0x1b) {
103                    decState = "escStart";
104                    continue;
105                } else if (byte >= 0x21 && byte <= 0x5f) {
106                    outFlag = false;
107                    out += dec2char(0xff61 + byte - 0x21);
108                    continue;
109                } else if (byte == endofstream) {
110                    finished = true;
111                    continue;
112                } else {
113                    outFlag = false;
114                    out += "�";
115                    continue;
116                }
117                break;
118            case "leadbyte":
119                if (byte == 0x1b) {
120                    decState = "escStart";
121                    continue;
122                } else if (byte >= 0x21 && byte <= 0x7e) {
123                    outFlag = false;
124                    isoLead = byte;
125                    decState = "trailbyte";
126                    continue;
127                } else if (byte == endofstream) {
128                    finished = true;
129                    continue;
130                } else {
131                    outFlag = false;
132                    out += "�";
133                    continue;
134                }
135                break;
136            case "trailbyte":
137                if (byte == 0x1b) {
138                    decState = "escStart";
139                    out += "�";
140                    continue;
141                } else if (byte >= 0x21 && byte <= 0x7e) {
142                    decState = "leadbyte";
143                    ptr = (isoLead - 0x21) * 94 + byte - 0x21;
144                    cp = jis0208[ptr];
145                    if (cp == null) {
146                        out += "�";
147                        continue;
148                    }
149                    out += dec2char(cp);
150                    continue;
151                } else if (byte == endofstream) {
152                    decState = "leadbyte";
153                    bytes.unshift(byte);
154                    out += "�";
155                    continue;
156                } else {
157                    decState = "leadbyte";
158                    out += "�";
159                    continue;
160                }
161                break;
162            case "escStart":
163                if (byte == 0x24 || byte == 0x28) {
164                    isoLead = byte;
165                    decState = "escape";
166                    continue;
167                } else {
168                    bytes.unshift(byte);
169                    outFlag = false;
170                    decState = outState;
171                    out += "�";
172                    continue;
173                }
174                break;
175            case "escape":
176                lead = isoLead;
177                isoLead = 0x00;
178                var state = null;
179                if (lead == 0x28 && byte == 0x42) state = "ascii";
180                if (lead == 0x28 && byte == 0x4a) state = "roman";
181                if (lead == 0x28 && byte == 0x49) state = "katakana";
182                if (lead == 0x24 && (byte == 0x40 || byte == 0x42))
183                    state = "leadbyte";
184                if (state != null) {
185                    decState = state;
186                    outState = state;
187                    var outputflag = false;
188                    outputflag = outFlag;
189                    outFlag = true;
190                    if (outputflag == false) continue;
191                    else {
192                        out += "�";
193                        continue;
194                    }
195                }
196                // Prepend the sequence (lead, byte) to the stream
197                bytes.unshift(lead, byte);
198                outFlag = false;
199                decState = outState;
200                out += "�";
201                continue;
202                break;
203        }
204    }
205    return out;
206}
207