1 /* Martin Asser Hansen (mail@maasha.dk) Copyright (C) 2008 - All right reserved */
12 bed_entry *bed_entry_new( const int cols )
14 bed_entry *entry = mem_get( sizeof( bed_entry ) );
17 entry->chr = mem_get( BED_CHR_MAX );
25 entry->q_id = mem_get( BED_QID_MAX );
45 entry->itemrgb = mem_get( BED_ITEMRGB_MAX );
46 entry->blockcount = 0;;
47 entry->blocksizes = mem_get( BED_BLOCKSIZES_MAX );
48 entry->q_begs = mem_get( BED_QBEGS_MAX );
54 bed_entry *bed_entry_get( FILE *fp, int cols )
56 bed_entry *entry = bed_entry_new( cols );
57 char buffer[ BED_BUFFER ];
59 assert( cols == 0 || cols == 3 || cols == 4 || cols == 5 || cols == 6 || cols == 12 );
61 if ( fgets( buffer, sizeof( buffer ), fp ) != NULL )
65 cols = 1 + strchr_total( buffer, '\t' );
100 "%s\t%u\t%u\t%s\t%i",
115 "%s\t%u\t%u\t%s\t%i\t%c",
131 "%s\t%u\t%u\t%s\t%i\t%c\t%u\t%u\t%s\t%u\t%s\t%s",
154 list_sl *bed_entries_get( char *path, const int cols )
156 list_sl *list = list_sl_new();
157 node_sl *node = node_sl_new();
158 node_sl *old_node = NULL;
159 bed_entry *entry = NULL;
162 fp = read_open( path );
164 if ( ( entry = bed_entry_get( fp, cols ) ) != NULL )
168 list_sl_add_beg( &list, &node );
173 while ( ( entry = bed_entry_get( fp, cols ) ) != NULL )
175 node = node_sl_new();
179 list_sl_add_after( &old_node, &node );
190 void bed_entry_put( bed_entry *entry, int cols )
205 else if ( cols == 4 )
215 else if ( cols == 5 )
218 "%s\t%u\t%u\t%s\t%i\n",
226 else if ( cols == 6 )
229 "%s\t%u\t%u\t%s\t%i\t%c\n",
238 else if ( cols == 12 )
241 "%s\t%u\t%u\t%s\t%i\t%c\t%u\t%u\t%s\t%u\t%s\t%s\n",
258 fprintf( stderr, "ERROR: Wrong number of columns in bed_entry_put: %d\n", cols );
265 void bed_entries_put( list_sl *entries, int cols )
267 node_sl *node = NULL;
269 for ( node = entries->first; node != NULL; node = node->next ) {
270 bed_entry_put( ( bed_entry * ) node->val, cols );
275 int cmp_bed_sort_beg( const void *a, const void *b )
277 node_sl *a_node = *( ( node_sl ** ) a );
278 node_sl *b_node = *( ( node_sl ** ) b );
280 bed_entry *a_entry = ( bed_entry * ) a_node->val;
281 bed_entry *b_entry = ( bed_entry * ) b_node->val;
283 if ( a_entry->chr_beg < b_entry->chr_beg ) {
285 } else if ( a_entry->chr_beg > b_entry->chr_beg ) {
293 int cmp_bed_sort_chr_beg( const void *a, const void *b )
295 node_sl *a_node = *( ( node_sl ** ) a );
296 node_sl *b_node = *( ( node_sl ** ) b );
298 bed_entry *a_entry = ( bed_entry * ) a_node->val;
299 bed_entry *b_entry = ( bed_entry * ) b_node->val;
303 diff = strcmp( a_entry->chr, b_entry->chr );
307 } else if ( diff > 0 ) {
309 } else if ( a_entry->chr_beg < b_entry->chr_beg ) {
311 } else if ( a_entry->chr_beg > b_entry->chr_beg ) {
319 int cmp_bed_sort_chr_strand_beg( const void *a, const void *b )
321 node_sl *a_node = *( ( node_sl ** ) a );
322 node_sl *b_node = *( ( node_sl ** ) b );
324 bed_entry *a_entry = ( bed_entry * ) a_node->val;
325 bed_entry *b_entry = ( bed_entry * ) b_node->val;
329 diff = strcmp( a_entry->chr, b_entry->chr );
333 } else if ( diff > 0 ) {
335 } else if ( a_entry->strand < b_entry->strand ) {
337 } else if ( a_entry->strand > b_entry->strand ) {
339 } else if ( a_entry->chr_beg < b_entry->chr_beg ) {
341 } else if ( a_entry->chr_beg > b_entry->chr_beg ) {