/* shinobu3.c (shinobu.c) - Don Yang (uguu.org) Preprocess 3: Optimize (pass 1) 10/11/00 */ #include #define MAX_STRING_SIZE (2 << 16) #define SPACE ' ' #define FILL_CHAR ';' char code[MAX_STRING_SIZE] = "Dchar" "@p[2B<o;iB--)" "q[i]=q[i-1];" "q[o]=a;" "}" "f()" "{" "Cfor(;(c=q[o])B64B&&c0;jB--)" "{" "Bif((k=q[o])-B59)" "{" "Bif(k-B32)" "g(B59);" "Delse@" "q[o]=B59;" "Freturn+1;" "}" "q[oB++]=e[iB++];" "}" "Freturn+0;" "}" "Freturn+x(e[iB++]);" "}" "s(z*a)" "{" "Cfor(i=o=0;a[i];iB++)" "Bif(a[i]-B32)" "a[oB++]=a[i];" "a[o]=0;" "}" "t(z*a)" "{" "Cfor(i=0;i<2B<B34B&&p[i]B92B&&p[i]B10;jB++)" "Bif(q[o+j]B==B59)" "kB++;" "Bif(!k)" "{" "g(B59);" "Freturn+1;" "}" "Cfor(j=1;j1)" "{" "Cfor(i=0;(c=Ggetchar())>0;q[iB++]=c);" "q[i]=0;" "t(q);" "}" "s(p);" "s(e);" "Cfor(w=u=v=0;wu)" "{" "u=i;" "v=0;" "}" "Bif(iB==u)" "Bif(B++v>B64)" "{" "Cfor(i=0;e[iB++];);" "e[i]=u=0;" "e[i-1]=B59;" "wB++;" "}" "}" "Cfor(i=0;q[i];Gputchar(q[iB++]));" "Bif(w>B31)" "Gputchar(B63);" "Freturn+0;" "}" , template[MAX_STRING_SIZE] = "!", string[MAX_STRING_SIZE]; int i, j, k, o, c, d; void Compress(char *source) { for(i = o = 0; source[i]; i++) if( source[i] - SPACE ) source[o++] = source[i]; source[o] = 0; } void FindTokenSpace(void) { for(; (c = string[o]) <= SPACE && c; o++); } void WriteChar(char token) { FindTokenSpace(); string[o++] = token; } void WriteToken(void) { if( (c = code[i]) > '@' && c <= 'Z' ) { FindTokenSpace(); c = code[i++] - '@'; for(j = c; j > 0; j--) { if( string[o] == '\n' ) { for(k = MAX_STRING_SIZE - 1; k > o; k--) string[k] = string[k - 1]; } string[o++] = code[i++]; } } else if( c - '@' ) { WriteChar(code[i++]); } else { i++; if( string[o] <= SPACE ) { if( string[o] ) { o++; return; } } string[o] = SPACE; } } void FormatString(char *source) { for(d = 0; d < 8; d++) WriteToken(); for(d = 0; source[d];) { WriteChar('\"'); for(j = k = 0; string[o + j] > '\n'; j++) if( string[o + j] == FILL_CHAR ) k++; for(j = 1; source[d] && j < k; j++) WriteChar(source[d++]); WriteChar('\"'); } } int main(int argc, char **argv) { if( argc > 1 ) { for(i = 0; (c = getchar()) > 0; string[i++] = (char)c); string[i] = 0; for(i = 0; i < MAX_STRING_SIZE; template[i++] = 0); for(i = j = 0; string[j]; j++) { if( (c = string[j]) == '\n' ) { c = template[i] ? (template[++i] = '!') : (template[i++] = '!'); } else if( c <= SPACE ) { c = ( template[i] >= '#' && template[i] < '[' ) ? template[i]++ : template[i] ? (template[++i] = '#') : (template[i] = '#'); } else { c = ( template[i] >= ']' && template[i] < '~' ) ? template[i]++ : template[i] ? (template[++i] = ']') : (template[i] = ']'); } } } Compress(template); Compress(code); for(o = 0; o < MAX_STRING_SIZE; string[o++] = 0); for(i = o = 0; template[i]; i++) { if( (j = template[i]) == '!' ) { string[o++] = '\n'; } else { for(k = j <= '[' ? '#' : ']'; k++ <= j; string[o++] = j <= '[' ? SPACE : FILL_CHAR); } } i = o = 0; WriteToken(); FormatString(code); FormatString(template); for(; code[i]; WriteToken()); for(i = 0; string[i]; putchar(string[i++])); return 0; }