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