/* shindou10_no_ucs2.c - Don Yang (uguu.org) 02/19/07 */ #include #include #include FILE *a; unsigned char *p, *b, *q = " \xef\xbc\x81I\xa1\xaa!"; int N,E,K,O,n,e,k,o,s,f,t,w,r, Z = 0xe38081, Y = 0xe3827f, W = 0xefbc81, V = 0xefbda1, U = 33089, T = 33438, S = 41378, d = 128, c = 160, u = 192, v = 224, x = 240, y = 248, z = 255; #define Q(_, _q) \ fwrite(_, _q, 1, stdout); #define X(_) }else if(_){ #define F(_) static void _(void) F(H) { if( n - O ) { n += fread(b + n, 1, O - n, a); X(1) p = b; b = malloc((O *= 2) + 3); memcpy(b, p, n); free(p); } } F(A) { r = (r << 8) | b[N++]; } F(B) { r = 0; if( (b[N] & v) - u ) { if( (b[N] & x) - v ) { if( (b[N] & y) - x ) { A(); X( (b[N + 1] & u) - d || (b[N + 2] & u) - d || (b[N + 2] & u) - d ) r--; X(1) A(); A(); A(); A(); } X( (b[N + 1] & u) - d || (b[N + 2] & u) - d ) r--; X(1) A(); A(); A(); } X( (b[N + 1] & u) - d ) r--; X(1) A(); A(); } } F(C) { r = 0; if( (b[N] > d && b[N] < c) || (b[N] >= v && b[N] < x) ) { if( b[N + 1] < 64 || b[N + 1] > z-3 ) { r--; X(1) A(); A(); } X(1) A(); } } F(D) { r = 0; if( (b[N] > c && b[N] < c+9) || b[N] == 173 || (b[N] > 175 && b[N] < x+5) || (b[N] > z-7 && b[N] < z-2) ) { if( b[N + 1] <= c || b[N + 1] >= z ) { r--; X(1) A(); A(); } X(1) A(); } } F(G) { n = e = k = o = 0; for(f = 7; !feof(a) && f & (f - 1);) { H(); if( *b + 1 - x || b[1] + 5 - u || b[2] + 1 - u ) { for(N = 0; N < n - 3 && f & 1;) { B(); if( r < 0 ) { f &= ~1; X( (r > Z+z && r < Y-u+1) || (r > Y && r < Y+21) ) e++; } } for(N = 0; N < n - 1 && f & 2;) { C(); if( r < 0 ) { f &= ~2; X( r > T && r < T+84 ) k++; } } for(N = 0; N < n - 1 && f & 4;) { D(); if( r < 0 ) { f &= ~4; X( r > 42144 && r < 42228 ) o++; } } X(1) f = 1; } } if( !(f & 1) ) e = 0; if( !(f & 2) ) k = 0; if( !(f & 4) ) o = 0; f = e < k ? k < o ? 4 : 2 : e < o ? 4 : f & 1 ? 1 : 2; } #define I \ (r > 96 && r < d-5) || \ (r > 64 && r < 91) || \ (r > 47 && r < 58) || \ r == 45 || r == 95 || \ r == 32 || r == 9 #define J \ r == 33 || \ (f & 1 && r == W) || \ (f & 2 && r == U+8) || \ (f & 4 && r == S+8) #define L \ r == 46 || r == 63 || \ (f & 1 && \ (r == W+30 || r == W+13 || r == Z+1 || \ r == V)) || \ (f & 2 && \ (r == U+7 || r == U+3 || r == U+1)) || \ (f & 4 && \ (r == S+7 || r == S+3 || r == S+1)) || \ J #define M \ r == 44 || r == 10 || \ (f & 1 && \ (r == W+11 || r == Z || r == V+3)) || \ (f & 2 && \ (r == U+2 || r == U)) || \ (f & 4 && \ (r == S+2 || r == S)) || \ L F(P) { b[t] -= b[t] > 96 && b[t] < d-5 ? 32 : 0; t++; } F(R) { for(t = E; t < N;) if( (b[t] & y) - x ) { if( (b[t] & x) - v ) { if( (b[t] & v) - u ) { P(); X(1) t += 2; } X(1) t += 3; } X(1) t += 4; } } F(m) { for(t = E; t < N;) if( (b[t] > d && b[N] < c) || (b[t] >= v && b[N] < x) ) { t++; X(1) P(); } } F(i) { Q(q + (r > z ? f & 1 ? 1 : f & 2 ? 3 : 5 : 7), (r > z ? f & 1 ? 3 : 2 : 1)); } F(h) { for(; E < s; E += t) { Q(b + E, t = ( f & 1 ? (b[E] & y) - x ? (b[E] & x) - v ? (b[E] & v) - u ? 1 : 2 : 3 : 4 : b[E] >= d ? 2 : 1)); Q(q, 1); } } #define g(NextChar, ToUpper) \ for(N = E = K = 0; !feof(a) || N < n;) \ { \ s = N; \ NextChar(); \ if( N < n - 3 ) \ { \ memmove(b, b + E, n - E); \ n -= E; \ N -= E; \ s -= E; \ E = 0; \ \ H(); \ } \ \ if( !K ) \ { \ if( r >= d ) \ { \ K = 2; \ X( I ) \ K = 1; \ X(1) \ Q(b + s, N - s); \ } \ E = s; \ X( M || \ (K - 1 && (I)) || \ (K - 2 && !(I)) ) \ if( L ) \ { \ if( K - 1 ) \ { \ h(); \ X(1) \ ToUpper(); \ } \ } \ if( E - s ) \ Q(b + E, s - E); \ if( J ) \ { \ i(); \ i(); \ X( (M) && r - 10 ) \ i(); \ X(1) \ Q(b + s, N - s); \ } \ K = 0; \ } \ } int main(int _l, char **_) { O = 4096; b = malloc(O); if( _l > 1 ) { for(w = 1; w < _l; w++) { Q(_[w], strlen(_[w])); Q(": ", 2); if( (a = fopen(_[w], "rb")) ) { G(); p = f - 1 ? f - 2 ? "EUC-JP" : "Shift_JIS" : "UTF-8"; fclose(a); X(1) p = "can not open file"; } puts(p); } X(1) a = stdin; G(); if( f & 1 ) { g(B, R) X( f & 2 ) g(C, m) X(1) g(D, m) } } free(b); return 0; }