/* encode.c - Don Yang (uguu.org) alternate keys: 5, 6, 21, 24, 29 For use with self.c/comment8.c 06/02/99: main */ #include #include #define BLOCK_COUNT 100 #define KEY 24 char data[6000]; int key; char getdata(int *pos); int main(int argc, char *argv[]) { int m[] = {16,0, -49,18,0, -47,16,0, -46,14,0, -26,14,-6,10,0, -22,21,-6,5,0, -20,26,-5,2,0, -18,31,0, -16,35,0, -14,39,0, -13,41,0, -11,45,0, -10,46,0, -9,48,0, -8,50,0, -7,52,0, -6,34,-9,8,0, -5,31,-14,7,0, -4,30,-4,2,-9,7,0, -4,28,-4,3,-11,6,0, -3,28,-3,5,-11,6,0, -2,28,-2,7,-11,6,0, -2,27,-2,8,-10,7,0, -1, +2,-2,10,-9,7,0, -1,26,-3,11,-7,8,0, 27,-5,27,0, 26,-6,27,0, /* 119 */ 0}, n, p, i; FILE *infile; int e = 0; char c; /* Load file */ if( argc < 2 ) return 1; if( (infile = fopen(argv[1], "rb")) == NULL ) return 1; for(p = 0; (i = fgetc(infile)) != EOF;) { if( i != 13 ) data[p++] = (char)((i == 10) ? 'x' : i); } fclose(infile); /* Encode file to stdout */ p--; for(n = 0; n < BLOCK_COUNT && p >= 0; n++) { if( !m[n] ) { putchar('\n'); } else { if( m[n] < 0 ) { for(i = 0; i > m[n]; i--) putchar(' '); } else { putchar('\"'); for(i = 0; i < m[n]; i++) { putchar(c = getdata(&p)); if( c == '\\' || c == '\"' || c < 32 || c > 126 ) e++; } putchar('\"'); } } } printf(";\n\np = %d\ne = %d\n", p + 1, e); return 0; } char getdata(int *pos) { static int r = 0; int i, j; if( *pos < 0 ) { (*pos)--; return '\n'; } if( r ) { r = 0; return (char)(' ' ^ KEY); } i = *pos; if( data[i] != ' ' ) { *pos = i - 1; return (char)(data[i] ^ KEY); } /* RLE compress spaces (next character returned is space) */ j = '@'; while( i > 0 ) { if( data[i - 1] != ' ' ) break; j++; i--; if( j == 'Z' ) break; } *pos = i - 1; r = 1; return (char)j; }