@@ -25,14 +25,53 @@ uint8_t *bam_aux_get_core(bam1_t *b, const char tag[2])
2525 return bam_aux_get (b , tag );
2626}
2727
28+ inline int aux_type2size (uint8_t type )
29+ {
30+ switch (type ) {
31+ case 'A' : case 'c' : case 'C' :
32+ return 1 ;
33+ case 's' : case 'S' :
34+ return 2 ;
35+ case 'i' : case 'I' : case 'f' :
36+ return 4 ;
37+ case 'd' :
38+ return 8 ;
39+ case 'Z' : case 'H' : case 'B' :
40+ return type ;
41+ default :
42+ return 0 ;
43+ }
44+ }
45+
46+ inline uint8_t * skip_aux (uint8_t * s ) {
47+ int size = aux_type2size (* s ); ++ s ; // skip type
48+ uint32_t n ;
49+ switch (size ) {
50+ case 'Z' :
51+ case 'H' :
52+ while (* s ) ++ s ;
53+ return s + 1 ;
54+ case 'B' :
55+ size = aux_type2size (* s ); ++ s ;
56+ memcpy (& n , s , 4 ); s += 4 ;
57+ return s + size * n ;
58+ case 0 :
59+ abort ();
60+ break ;
61+ default :
62+ return s + size ;
63+ }
64+ }
65+
66+ /*
2867#define __skip_tag(s) do { \
2968 int type = toupper(*(s)); \
3069 ++(s); \
3170 if (type == 'Z' || type == 'H') { while (*(s)) ++(s); ++(s); } \
3271 else if (type == 'B') (s) += 5 + bam_aux_type2size(*(s)) * (*(int32_t*)((s)+1)); \
3372 else (s) += bam_aux_type2size(*(s)); \
3473 } while(0)
35-
74+ */
3675uint8_t * bam_aux_get (const bam1_t * b , const char tag [2 ])
3776{
3877 uint8_t * s ;
@@ -42,7 +81,8 @@ uint8_t *bam_aux_get(const bam1_t *b, const char tag[2])
4281 int x = (int )s [0 ]<<8 | s [1 ];
4382 s += 2 ;
4483 if (x == y ) return s ;
45- __skip_tag (s );
84+ //__skip_tag(s);
85+ s = skip_aux (s );
4686 }
4787 return 0 ;
4888}
@@ -52,7 +92,8 @@ int bam_aux_del(bam1_t *b, uint8_t *s)
5292 uint8_t * p , * aux ;
5393 aux = bam1_aux (b );
5494 p = s - 2 ;
55- __skip_tag (s );
95+ //__skip_tag(s);
96+ s = skip_aux (s );
5697 memmove (p , s , b -> l_aux - (s - aux ));
5798 b -> data_len -= s - p ;
5899 b -> l_aux -= s - p ;
@@ -65,7 +106,8 @@ int bam_aux_drop_other(bam1_t *b, uint8_t *s)
65106 uint8_t * p , * aux ;
66107 aux = bam1_aux (b );
67108 p = s - 2 ;
68- __skip_tag (s );
109+ //__skip_tag(s);
110+ s = skip_aux (s );
69111 memmove (aux , p , s - p );
70112 b -> data_len -= b -> l_aux - (s - p );
71113 b -> l_aux = s - p ;
0 commit comments