| 132 | | if (ptr[i] == ESC && (size - i >= 3)) { |
| 133 | | if ((ptr[i + 1] == '$' && ptr[i + 2] == 'B') |
| 134 | | || (ptr[i + 1] == '(' && ptr[i + 2] == 'B')) { |
| 135 | | code = JIS; |
| 136 | | goto breakBreak; |
| 137 | | } else if ((ptr[i + 1] == '$' && ptr[i + 2] == '@') |
| 138 | | || (ptr[i + 1] == '(' && ptr[i + 2] == 'J')) { |
| 139 | | code = JIS; |
| 140 | | goto breakBreak; |
| 141 | | } else if (ptr[i + 1] == '(' && ptr[i + 2] == 'I') { |
| 142 | | code = JIS; |
| 143 | | i += 3; |
| 144 | | } else if (ptr[i + 1] == ')' && ptr[i + 2] == 'I') { |
| 145 | | code = JIS; |
| 146 | | i += 3; |
| 147 | | } else { |
| 148 | | i++; |
| 149 | | } |
| 150 | | bfr = FALSE; |
| 151 | | bfk = 0; |
| 152 | | } else { |
| 153 | | if (ptr[i] < 0x20) { |
| 154 | | bfr = FALSE; |
| 155 | | bfk = 0; |
| 156 | | /* ?? check kudokuten ?? && ?? hiragana ?? */ |
| 157 | | if ((i >= 2) && (ptr[i - 2] == 0x81) |
| 158 | | && (0x41 <= ptr[i - 1] && ptr[i - 1] <= 0x49)) { |
| 159 | | code = SJIS; |
| 160 | | sjis += 100; /* kudokuten */ |
| 161 | | } else if ((i >= 2) && (ptr[i - 2] == 0xa1) |
| 162 | | && (0xa2 <= ptr[i - 1] && ptr[i - 1] <= 0xaa)) { |
| 163 | | code = EUC; |
| 164 | | euc += 100; /* kudokuten */ |
| 165 | | } else if ((i >= 2) && (ptr[i - 2] == 0x82) && (0xa0 <= ptr[i - 1])) { |
| 166 | | sjis += 40; /* hiragana */ |
| 167 | | } else if ((i >= 2) && (ptr[i - 2] == 0xa4) && (0xa0 <= ptr[i - 1])) { |
| 168 | | euc += 40; /* hiragana */ |
| 169 | | } |
| 170 | | } else { |
| 171 | | /* ?? check hiragana or katana ?? */ |
| 172 | | if ((size - i > 1) && (ptr[i] == 0x82) && (0xa0 <= ptr[i + 1])) { |
| 173 | | sjis++; /* hiragana */ |
| 174 | | } else if ((size - i > 1) && (ptr[i] == 0x83) |
| 175 | | && (0x40 <= ptr[i + 1] && ptr[i + 1] <= 0x9f)) { |
| 176 | | sjis++; /* katakana */ |
| 177 | | } else if ((size - i > 1) && (ptr[i] == 0xa4) && (0xa0 <= ptr[i + 1])) { |
| 178 | | euc++; /* hiragana */ |
| 179 | | } else if ((size - i > 1) && (ptr[i] == 0xa5) && (0xa0 <= ptr[i + 1])) { |
| 180 | | euc++; /* katakana */ |
| 181 | | } |
| 182 | | if (bfr) { |
| 183 | | if ((i >= 1) && (0x40 <= ptr[i] && ptr[i] <= 0xa0) && ISkanji(ptr[i - 1])) { |
| 184 | | code = SJIS; |
| 185 | | goto breakBreak; |
| 186 | | } else if ((i >= 1) && (0x81 <= ptr[i - 1] && ptr[i - 1] <= 0x9f) && ((0x40 <= ptr[i] && ptr[i] < 0x7e) || (0x7e < ptr[i] && ptr[i] <= 0xfc))) { |
| 187 | | code = SJIS; |
| 188 | | goto breakBreak; |
| 189 | | } else if ((i >= 1) && (0xfd <= ptr[i] && ptr[i] <= 0xfe) && (0xa1 <= ptr[i - 1] && ptr[i - 1] <= 0xfe)) { |
| 190 | | code = EUC; |
| 191 | | goto breakBreak; |
| 192 | | } else if ((i >= 1) && (0xfd <= ptr[i - 1] && ptr[i - 1] <= 0xfe) && (0xa1 <= ptr[i] && ptr[i] <= 0xfe)) { |
| 193 | | code = EUC; |
| 194 | | goto breakBreak; |
| 195 | | } else if ((i >= 1) && (ptr[i] < 0xa0 || 0xdf < ptr[i]) && (0x8e == ptr[i - 1])) { |
| 196 | | code = SJIS; |
| 197 | | goto breakBreak; |
| 198 | | } else if (ptr[i] <= 0x7f) { |
| 199 | | code = SJIS; |
| 200 | | goto breakBreak; |
| 201 | | } else { |
| 202 | | if (0xa1 <= ptr[i] && ptr[i] <= 0xa6) { |
| 203 | | euc++; /* sjis hankaku kana kigo */ |
| 204 | | } else if (0xa1 <= ptr[i] && ptr[i] <= 0xdf) { |
| 205 | | ; /* sjis hankaku kana */ |
| 206 | | } else if (0xa1 <= ptr[i] && ptr[i] <= 0xfe) { |
| 207 | | euc++; |
| 208 | | } else if (0x8e == ptr[i]) { |
| 209 | | euc++; |
| 210 | | } else if (0x20 <= ptr[i] && ptr[i] <= 0x7f) { |
| 211 | | sjis++; |
| 212 | | } |
| 213 | | bfr = FALSE; |
| 214 | | bfk = 0; |
| 215 | | } |
| 216 | | } else if (0x8e == ptr[i]) { |
| 217 | | if (size - i <= 1) { |
| 218 | | ; |
| 219 | | } else if (0xa1 <= ptr[i + 1] && ptr[i + 1] <= 0xdf) { |
| 220 | | /* EUC KANA or SJIS KANJI */ |
| 221 | | if (bfk == 1) { |
| 222 | | euc += 100; |
| 223 | | } |
| 224 | | bfk++; |
| 225 | | i++; |
| 226 | | } else { |
| 227 | | /* SJIS only */ |
| 228 | | code = SJIS; |
| 229 | | goto breakBreak; |
| 230 | | } |
| 231 | | } else if (0x81 <= ptr[i] && ptr[i] <= 0x9f) { |
| 232 | | /* SJIS only */ |
| 233 | | code = SJIS; |
| 234 | | if ((size - i >= 1) |
| 235 | | && ((0x40 <= ptr[i + 1] && ptr[i + 1] <= 0x7e) |
| 236 | | || (0x80 <= ptr[i + 1] && ptr[i + 1] <= 0xfc))) { |
| 237 | | goto breakBreak; |
| 238 | | } |
| 239 | | } else if (0xfd <= ptr[i] && ptr[i] <= 0xfe) { |
| 240 | | /* EUC only */ |
| 241 | | code = EUC; |
| 242 | | if ((size - i >= 1) |
| 243 | | && (0xa1 <= ptr[i + 1] && ptr[i + 1] <= 0xfe)) { |
| 244 | | goto breakBreak; |
| 245 | | } |
| 246 | | } else if (ptr[i] <= 0x7f) { |
| 247 | | ; |
| 248 | | } else { |
| 249 | | bfr = TRUE; |
| 250 | | bfk = 0; |
| 251 | | } |
| 252 | | } |
| 253 | | i++; |
| 254 | | } |
| | 132 | if (ptr[i] == ESC && (size - i >= 3)) { |
| | 133 | if ((ptr[i + 1] == '$' && ptr[i + 2] == 'B') |
| | 134 | || (ptr[i + 1] == '(' && ptr[i + 2] == 'B')) { |
| | 135 | code = JIS; |
| | 136 | goto breakBreak; |
| | 137 | } else if ((ptr[i + 1] == '$' && ptr[i + 2] == '@') |
| | 138 | || (ptr[i + 1] == '(' && ptr[i + 2] == 'J')) { |
| | 139 | code = JIS; |
| | 140 | goto breakBreak; |
| | 141 | } else if (ptr[i + 1] == '(' && ptr[i + 2] == 'I') { |
| | 142 | code = JIS; |
| | 143 | i += 3; |
| | 144 | } else if (ptr[i + 1] == ')' && ptr[i + 2] == 'I') { |
| | 145 | code = JIS; |
| | 146 | i += 3; |
| | 147 | } else { |
| | 148 | i++; |
| | 149 | } |
| | 150 | bfr = FALSE; |
| | 151 | bfk = 0; |
| | 152 | } else { |
| | 153 | if (ptr[i] < 0x20) { |
| | 154 | bfr = FALSE; |
| | 155 | bfk = 0; |
| | 156 | /* ?? check kudokuten ?? && ?? hiragana ?? */ |
| | 157 | if ((i >= 2) && (ptr[i - 2] == 0x81) |
| | 158 | && (0x41 <= ptr[i - 1] && ptr[i - 1] <= 0x49)) { |
| | 159 | code = SJIS; |
| | 160 | sjis += 100; /* kudokuten */ |
| | 161 | } else if ((i >= 2) && (ptr[i - 2] == 0xa1) |
| | 162 | && (0xa2 <= ptr[i - 1] && ptr[i - 1] <= 0xaa)) { |
| | 163 | code = EUC; |
| | 164 | euc += 100; /* kudokuten */ |
| | 165 | } else if ((i >= 2) && (ptr[i - 2] == 0x82) && (0xa0 <= ptr[i - 1])) { |
| | 166 | sjis += 40; /* hiragana */ |
| | 167 | } else if ((i >= 2) && (ptr[i - 2] == 0xa4) && (0xa0 <= ptr[i - 1])) { |
| | 168 | euc += 40; /* hiragana */ |
| | 169 | } |
| | 170 | } else { |
| | 171 | /* ?? check hiragana or katana ?? */ |
| | 172 | if ((size - i > 1) && (ptr[i] == 0x82) && (0xa0 <= ptr[i + 1])) { |
| | 173 | sjis++; /* hiragana */ |
| | 174 | } else if ((size - i > 1) && (ptr[i] == 0x83) |
| | 175 | && (0x40 <= ptr[i + 1] && ptr[i + 1] <= 0x9f)) { |
| | 176 | sjis++; /* katakana */ |
| | 177 | } else if ((size - i > 1) && (ptr[i] == 0xa4) && (0xa0 <= ptr[i + 1])) { |
| | 178 | euc++; /* hiragana */ |
| | 179 | } else if ((size - i > 1) && (ptr[i] == 0xa5) && (0xa0 <= ptr[i + 1])) { |
| | 180 | euc++; /* katakana */ |
| | 181 | } |
| | 182 | if (bfr) { |
| | 183 | if ((i >= 1) && (0x40 <= ptr[i] && ptr[i] <= 0xa0) && ISkanji(ptr[i - 1])) { |
| | 184 | code = SJIS; |
| | 185 | goto breakBreak; |
| | 186 | } else if ((i >= 1) && (0x81 <= ptr[i - 1] && ptr[i - 1] <= 0x9f) && ((0x40 <= ptr[i] && ptr[i] < 0x7e) || (0x7e < ptr[i] && ptr[i] <= 0xfc))) { |
| | 187 | code = SJIS; |
| | 188 | goto breakBreak; |
| | 189 | } else if ((i >= 1) && (0xfd <= ptr[i] && ptr[i] <= 0xfe) && (0xa1 <= ptr[i - 1] && ptr[i - 1] <= 0xfe)) { |
| | 190 | code = EUC; |
| | 191 | goto breakBreak; |
| | 192 | } else if ((i >= 1) && (0xfd <= ptr[i - 1] && ptr[i - 1] <= 0xfe) && (0xa1 <= ptr[i] && ptr[i] <= 0xfe)) { |
| | 193 | code = EUC; |
| | 194 | goto breakBreak; |
| | 195 | } else if ((i >= 1) && (ptr[i] < 0xa0 || 0xdf < ptr[i]) && (0x8e == ptr[i - 1])) { |
| | 196 | code = SJIS; |
| | 197 | goto breakBreak; |
| | 198 | } else if (ptr[i] <= 0x7f) { |
| | 199 | code = SJIS; |
| | 200 | goto breakBreak; |
| | 201 | } else { |
| | 202 | if (0xa1 <= ptr[i] && ptr[i] <= 0xa6) { |
| | 203 | euc++; /* sjis hankaku kana kigo */ |
| | 204 | } else if (0xa1 <= ptr[i] && ptr[i] <= 0xdf) { |
| | 205 | ; /* sjis hankaku kana */ |
| | 206 | } else if (0xa1 <= ptr[i] && ptr[i] <= 0xfe) { |
| | 207 | euc++; |
| | 208 | } else if (0x8e == ptr[i]) { |
| | 209 | euc++; |
| | 210 | } else if (0x20 <= ptr[i] && ptr[i] <= 0x7f) { |
| | 211 | sjis++; |
| | 212 | } |
| | 213 | bfr = FALSE; |
| | 214 | bfk = 0; |
| | 215 | } |
| | 216 | } else if (0x8e == ptr[i]) { |
| | 217 | if (size - i <= 1) { |
| | 218 | ; |
| | 219 | } else if (0xa1 <= ptr[i + 1] && ptr[i + 1] <= 0xdf) { |
| | 220 | /* EUC KANA or SJIS KANJI */ |
| | 221 | if (bfk == 1) { |
| | 222 | euc += 100; |
| | 223 | } |
| | 224 | bfk++; |
| | 225 | i++; |
| | 226 | } else { |
| | 227 | /* SJIS only */ |
| | 228 | code = SJIS; |
| | 229 | goto breakBreak; |
| | 230 | } |
| | 231 | } else if (0x81 <= ptr[i] && ptr[i] <= 0x9f) { |
| | 232 | /* SJIS only */ |
| | 233 | code = SJIS; |
| | 234 | if ((size - i >= 1) |
| | 235 | && ((0x40 <= ptr[i + 1] && ptr[i + 1] <= 0x7e) |
| | 236 | || (0x80 <= ptr[i + 1] && ptr[i + 1] <= 0xfc))) { |
| | 237 | goto breakBreak; |
| | 238 | } |
| | 239 | } else if (0xfd <= ptr[i] && ptr[i] <= 0xfe) { |
| | 240 | /* EUC only */ |
| | 241 | code = EUC; |
| | 242 | if ((size - i >= 1) |
| | 243 | && (0xa1 <= ptr[i + 1] && ptr[i + 1] <= 0xfe)) { |
| | 244 | goto breakBreak; |
| | 245 | } |
| | 246 | } else if (ptr[i] <= 0x7f) { |
| | 247 | ; |
| | 248 | } else { |
| | 249 | bfr = TRUE; |
| | 250 | bfk = 0; |
| | 251 | } |
| | 252 | } |
| | 253 | i++; |
| | 254 | } |