6 uint fasta_count( FILE *fp )
8 /* Martin A. Hansen, May 2008 */
10 /* Counts all entries in a FASTA file given a file pointer. */
12 char buffer[ FASTA_BUFFER ];
17 while ( ( fgets( buffer, sizeof( buffer ), fp ) ) != NULL )
19 if ( buffer[ 0 ] == '>' ) {
28 bool fasta_get_entry( FILE *fp, struct seq_entry *entry )
30 /* Martin A. Hansen, May 2008 */
32 /* Get next sequence entry from a FASTA file given a file pointer. */
38 char buffer[ FASTA_BUFFER ];
40 char *seq_name = NULL;
47 /* ---- Skip ahead until header line and include header ---- */
49 while ( fgets( buffer, sizeof( buffer ), fp ) != NULL )
51 buffer_len = strlen( buffer );
55 if ( ( buffer[ 0 ] == '>' ) )
57 seq_name = mem_get_zero( buffer_len - 1 );
59 for ( i = 1; i < buffer_len - 1; i++ ) {
60 seq_name[ i - 1 ] = buffer[ i ];
69 /* ---- Determine length of sequence ---- */
73 while ( ( fgets( buffer, sizeof( buffer ), fp ) != NULL ) )
75 for ( i = 0; buffer[ i ]; i++ )
77 if ( buffer[ i ] > 32 && buffer[ i ] < 127 ) {
82 if ( ( buffer[ 0 ] == '>' ) )
84 seq_len -= strlen( buffer ) - 1;
90 /* ---- Allocate memory for sequence ---- */
92 seq = mem_get_zero( seq_len + 1 );
94 /* ---- Rewind file pointer and read sequence ---- */
96 if ( fseek( fp, offset, SEEK_SET ) < 0 ) {
97 die( "fseek SEEK_SET failed." );
102 while ( ( fgets( buffer, sizeof( buffer ), fp ) != NULL ) )
104 for ( i = 0; buffer[ i ]; i++ )
106 if ( buffer[ i ] > 32 && buffer[ i ] < 127 )
108 seq[ j ] = buffer[ i ];
110 if ( j == seq_len - 1 )
114 entry->seq_name = seq_name;
116 entry->seq_len = seq_len;
130 void fasta_put_entry( struct seq_entry *entry )
132 /* Martin A. Hansen, May 2008 */
134 /* Output a sequence entry in FASTA format. */
135 printf( ">%s\n%s\n", entry->seq_name, entry->seq );
139 void fasta_get_entries( FILE *fp, struct list **entries )
141 /* Martin A. Hansen, May 2008 */
143 /* Given a file pointer to a FASTA file retreives all */
144 /* sequence entries and insert those in a list. */
146 struct seq_entry *entry;
152 if ( ! fasta_get_entry( fp, entry ) ) {
156 list_add( entries, entry );
159 list_reverse( entries );
163 void fasta_put_entries( struct list *entries )
165 /* Martin A. Hansen, May 2008 */
167 /* Output a list of sequence entries as FASTA records. */
171 for ( elem = entries; elem != NULL; elem = elem->next ) {
172 fasta_put_entry( elem->val );
177 void fasta_free_entry( struct seq_entry *entry )
179 /* Martin A. Hansen, June 2008 */
181 /* Deallocates memory from a seq_entry. */
183 mem_free( entry->seq_name );
184 mem_free( entry->seq );