]> git.donarmstrong.com Git - biopieces.git/blob - code_c/Maasha/src/lib/ucsc.c
Here we go
[biopieces.git] / code_c / Maasha / src / lib / ucsc.c
1 #include "common.h"
2 #include "ucsc.h"
3
4 void bed_get_entry( FILE *fp, struct bed_entry3 *bed, int cols )
5 {
6     /* Martin A. Hansen, June 2008 */
7
8     /* Get next 3 column bed entry from stream. */
9
10     char bed_buffer[ BED_BUFFER ];
11     struct bed_entry12 *bed12 = NULL;
12
13     MEM_GET( bed12 );
14
15     if ( ( fgets( bed_buffer, sizeof( bed_buffer ), fp ) != NULL ) )
16     {
17         printf( "buffer: %s\n", bed_buffer );
18     
19         bed_split( bed_buffer, bed12, 3 );
20
21         return;
22     }
23
24     return NULL;
25 }
26
27
28 void bed_split( char *string, struct bed_entry12 *bed, int cols )
29 {
30     int   i;
31     int   field_num;
32     int   offset;
33     char *new_line;
34     int   new_line_pos;
35     char *pt;
36     int   pos;
37     int   field_seps[ cols ];
38     int   field_len;
39     char *field;
40
41     if ( ( new_line = memchr( string, '\n', 1024 ) ) != NULL ) {
42         new_line_pos = new_line - string;
43     } else {
44         die( "bed_split: no newline found." );
45     }
46
47     field_num = 0;
48     offset    = 0;
49
50     for ( i = 0; i < cols; i++ )
51     {
52         if ( ( pt = memchr( &string[ offset ], '\t', new_line_pos - offset ) ) != NULL )
53         {
54             pos = pt - string;
55
56             pos = MIN( pos, new_line_pos );
57
58             field_seps[ field_num ] = pos;
59
60             field_num++;
61         }
62         else
63         {
64             die( "bed_split: no tab found." );
65         }
66
67         offset += pos + 1;
68     }
69
70     offset = 0;
71
72     for ( i = 0; i < cols; i++ )
73     {
74         field_len = field_seps[ i ] - offset;
75
76         field = mem_get( field_len );
77
78         field[ field_len ] = '\0';
79
80         memcpy( field, &string[ offset ], field_len );
81
82         if ( i == 0 ) {
83             bed->chr = mem_clone( ( char * ) field, field_len );
84         } else if ( i == 1 ) {
85             bed->chr_beg = strtod( field, &pt );
86         } else if ( i == 2 ) {
87             bed->chr_end = strtod( field, &pt );
88         } else if ( i == 3 ) {
89             bed->q_id = mem_clone( ( char * ) field, field_len );
90         } else if ( i == 4 ) {
91             bed->score = strtof( field, &pt );
92         } else if ( i == 5 ) {
93             bed->strand = field[ 0 ];
94         } else if ( i == 6 ) {
95             bed->thick_beg = strtod( field, &pt );
96         } else if ( i == 7 ) {
97             bed->thick_end = strtod( field, &pt );
98         } else if ( i == 8 ) {
99             bed->itemrgb = mem_clone( ( char * ) field, field_len );
100         } else if ( i == 9 ) {
101             bed->blockcount = strtod( field, &pt );
102         } else if ( i == 10 ) {
103             bed->blocksizes = mem_clone( ( char * ) field, field_len );
104         } else if ( i == 11 ) {
105             bed->q_begs = mem_clone( ( char * ) field, field_len );
106         }
107
108         if ( pt == NULL ) {
109             die( "bed parse failed." );
110         }
111
112         offset = field_seps[ i ] + 1;
113     }
114
115     printf( "chr    ->%s\n", bed->chr );
116     printf( "chr_beg->%u\n", bed->chr_beg );
117     printf( "chr_end->%u\n", bed->chr_end );
118 }
119
120