7 uint fasta_count( FILE *fp )
9 /* Martin A. Hansen, May 2008 */
11 /* Counts all entries in a FASTA file given a file pointer. */
13 char buffer[ FASTA_BUFFER ];
18 while ( ( fgets( buffer, sizeof( buffer ), fp ) ) != NULL )
20 if ( buffer[ 0 ] == '>' ) {
29 bool fasta_get_entry( FILE *fp, struct seq_entry *entry )
31 /* Martin A. Hansen, May 2008 */
33 /* Get next sequence entry from a FASTA file given a file pointer. */
39 char buffer[ FASTA_BUFFER ];
41 char *seq_name = NULL;
44 entry = mem_get( sizeof( entry ) );
48 /* ---- Skip ahead until header line and include header ---- */
50 while ( fgets( buffer, sizeof( buffer ), fp ) != NULL )
52 buffer_len = strlen( buffer );
56 if ( ( buffer[ 0 ] == '>' ) )
58 seq_name = mem_get_zero( buffer_len - 1 );
60 for ( i = 1; i < buffer_len - 1; i++ ) {
61 seq_name[ i - 1 ] = buffer[ i ];
70 /* ---- Determine length of sequence ---- */
74 while ( ( fgets( buffer, sizeof( buffer ), fp ) != NULL ) )
76 for ( i = 0; buffer[ i ]; i++ )
78 if ( buffer[ i ] > 32 && buffer[ i ] < 127 ) {
83 if ( ( buffer[ 0 ] == '>' ) )
85 seq_len -= strlen( buffer ) - 1;
91 /* ---- Allocate memory for sequence ---- */
93 seq = mem_get_zero( seq_len + 1 );
95 /* ---- Rewind file pointer and read sequence ---- */
97 if ( fseek( fp, offset, SEEK_SET ) < 0 ) {
98 die( "fseek SEEK_SET failed." );
103 while ( ( fgets( buffer, sizeof( buffer ), fp ) != NULL ) )
105 for ( i = 0; buffer[ i ]; i++ )
107 if ( buffer[ i ] > 32 && buffer[ i ] < 127 )
109 seq[ j ] = buffer[ i ];
111 if ( j == seq_len - 1 )
115 entry->seq_name = seq_name;
117 entry->seq_len = seq_len;
131 void fasta_put_entry( struct seq_entry *entry )
133 /* Martin A. Hansen, May 2008 */
135 /* Output a sequence entry in FASTA format. */
136 printf( ">%s\n%s\n", entry->seq_name, entry->seq );
140 void fasta_get_entries( FILE *fp, struct list **entries )
142 /* Martin A. Hansen, May 2008 */
144 /* Given a file pointer to a FASTA file retreives all */
145 /* sequence entries and insert those in a list. */
147 struct seq_entry *entry;
151 entry = mem_get( sizeof( entry ) );
153 if ( ! fasta_get_entry( fp, entry ) ) {
157 list_add( entries, entry );
160 list_reverse( entries );
164 void fasta_put_entries( struct list *entries )
166 /* Martin A. Hansen, May 2008 */
168 /* Output a list of sequence entries as FASTA records. */
172 for ( elem = entries; elem != NULL; elem = elem->next ) {
173 fasta_put_entry( elem->val );
178 void fasta_free_entry( struct seq_entry *entry )
180 /* Martin A. Hansen, June 2008 */
182 /* Deallocates memory from a seq_entry. */
184 mem_free( ( void * ) &entry->seq_name );
185 mem_free( ( void * ) &entry->seq );
186 mem_free( ( void * ) &entry );