/* Converts a fasta file into a compressed code for DNA. * Note that the output is not printable. */ /* Copyright (c) 1999 Blossom Associates West */ /* All rights reserved. */ #include /* BUG: invalid codes become 'A' */ void putResidue( int r ) { static unsigned char b; unsigned char b1; char c; static int p = 0; c = toupper( r ); switch ( c ) { case 'A': b1 = 0; break; case 'C': b1 = 1; break; case 'G': b1 = 2; break; case 'T': case 'U': b1 = 3; break; case '<': /* end of input */ if ( 0 < p ) { printf( "%x) ", b ); } return; default: return; } b1 = b1 << p; b |= b1; p += 2; p %= 8; printf( "p%d ", p ); putchar( '.' ); printf( "%x ", b ); if ( 0 == p ) { printf( "(%x) ", b ); b = 0; } } int main( int argc, char* argv[] ) { int c; enum { BOL, HEAD, SEQ }; int state = BOL; printf( "hello\n" ); while ( EOF != ( c = getchar() ) ) { switch ( state ) { case SEQ: putResidue( c ); break; case BOL: if ( '>' == c || ';' == c ) { state = HEAD; putchar( c ); } else { state = SEQ; putResidue( c ); } break; case HEAD: putchar( c ); if ( '\n' == c ) { state = BOL; } break; } } }