@@ -2621,29 +2621,68 @@ static int bcf_enc_long1(kstring_t *s, int64_t x) {
2621
2621
}
2622
2622
#endif
2623
2623
2624
- int bcf_enc_vlong (kstring_t * s , const int n , const int64_t * a , int wsize )
2624
+ int bcf_enc_vlong (kstring_t * s , const int n , const int64_t * a , int wsize )//supposed to be optimized, not working yet.
2625
2625
{
2626
2626
int64_t max = INT64_MIN , min = INT64_MAX ;
2627
2627
int i ;
2628
- if (n <= 0 ) return bcf_enc_size (s , 0 , BCF_BT_NULL );
2629
- else if (n == 1 ) return bcf_enc_long1 (s , a [0 ]);
2630
- else {
2628
+ if (n <= 0 ) {
2629
+ return bcf_enc_size (s , 0 , BCF_BT_NULL );
2630
+ } else if (n == 1 ) {
2631
+ return bcf_enc_long1 (s , a [0 ]);
2632
+ } else {
2631
2633
if (wsize <= 0 ) wsize = n ;
2632
- for (i = 0 ; i < n ; ++ i ) {
2633
- if (a [i ] == bcf_int64_missing || a [i ] == bcf_int64_vector_end ) continue ;
2634
+
2635
+ // Equivalent to:
2636
+ // for (i = 0; i < n; ++i) {
2637
+ // if (a[i] == bcf_int32_missing || a[i] == bcf_int32_vector_end )
2638
+ // continue;
2639
+ // if (max < a[i]) max = a[i];
2640
+ // if (min > a[i]) min = a[i];
2641
+ // }
2642
+ int64_t max4 [4 ] = {INT64_MIN , INT64_MIN , INT64_MIN , INT64_MIN };
2643
+ int64_t min4 [4 ] = {INT64_MAX , INT64_MAX , INT64_MAX , INT64_MAX };
2644
+ for (i = 0 ; i < (n & ~3 ); i += 4 ) {
2645
+ // bcf_int32_missing == INT32_MIN and
2646
+ // bcf_int32_vector_end == INT32_MIN+1.
2647
+ // We skip these, but can mostly avoid explicit checking
2648
+ if (max4 [0 ] < a [i + 0 ]) max4 [0 ] = a [i + 0 ];
2649
+ if (max4 [1 ] < a [i + 1 ]) max4 [1 ] = a [i + 1 ];
2650
+ if (max4 [2 ] < a [i + 2 ]) max4 [2 ] = a [i + 2 ];
2651
+ if (max4 [3 ] < a [i + 3 ]) max4 [3 ] = a [i + 3 ];
2652
+ if (min4 [0 ] > a [i + 0 ] && a [i + 0 ] > INT64_MIN + 1 ) min4 [0 ] = a [i + 0 ];
2653
+ if (min4 [1 ] > a [i + 1 ] && a [i + 1 ] > INT64_MIN + 1 ) min4 [1 ] = a [i + 1 ];
2654
+ if (min4 [2 ] > a [i + 2 ] && a [i + 2 ] > INT64_MIN + 1 ) min4 [2 ] = a [i + 2 ];
2655
+ if (min4 [3 ] > a [i + 3 ] && a [i + 3 ] > INT64_MIN + 1 ) min4 [3 ] = a [i + 3 ];
2656
+ }
2657
+ min = min4 [0 ];
2658
+ if (min > min4 [1 ]) min = min4 [1 ];
2659
+ if (min > min4 [2 ]) min = min4 [2 ];
2660
+ if (min > min4 [3 ]) min = min4 [3 ];
2661
+ max = max4 [0 ];
2662
+ if (max < max4 [1 ]) max = max4 [1 ];
2663
+ if (max < max4 [2 ]) max = max4 [2 ];
2664
+ if (max < max4 [3 ]) max = max4 [3 ];
2665
+ for (; i < n ; ++ i ) {
2634
2666
if (max < a [i ]) max = a [i ];
2635
- if (min > a [i ]) min = a [i ];
2667
+ if (min > a [i ] && a [ i ] > INT64_MIN + 1 ) min = a [i ];
2636
2668
}
2669
+
2637
2670
if (max <= BCF_MAX_BT_INT8 && min >= BCF_MIN_BT_INT8 ) {
2638
- bcf_enc_size (s , wsize , BCF_BT_INT8 );
2639
- for (i = 0 ; i < n ; ++ i )
2640
- if ( a [i ]== bcf_int64_vector_end ) kputc (bcf_int8_vector_end , s );
2641
- else if ( a [i ]== bcf_int64_missing ) kputc (bcf_int8_missing , s );
2642
- else kputc (a [i ], s );
2671
+ if (bcf_enc_size (s , wsize , BCF_BT_INT8 ) < 0 ||
2672
+ ks_resize (s , s -> l + n ) < 0 )
2673
+ return -1 ;
2674
+ uint8_t * p = (uint8_t * ) s -> s + s -> l ;
2675
+ for (i = 0 ; i < n ; ++ i , p ++ ) {
2676
+ if ( a [i ]== bcf_int64_vector_end ) * p = bcf_int8_vector_end ;
2677
+ else if ( a [i ]== bcf_int64_missing ) * p = bcf_int8_missing ;
2678
+ else * p = a [i ];
2679
+ }
2680
+ s -> l += n ;
2643
2681
} else if (max <= BCF_MAX_BT_INT16 && min >= BCF_MIN_BT_INT16 ) {
2644
2682
uint8_t * p ;
2645
- bcf_enc_size (s , wsize , BCF_BT_INT16 );
2646
- ks_resize (s , s -> l + n * sizeof (int16_t ));
2683
+ if (bcf_enc_size (s , wsize , BCF_BT_INT16 ) < 0 ||
2684
+ ks_resize (s , s -> l + n * sizeof (int16_t )) < 0 )
2685
+ return -1 ;
2647
2686
p = (uint8_t * ) s -> s + s -> l ;
2648
2687
for (i = 0 ; i < n ; ++ i )
2649
2688
{
@@ -2657,8 +2696,9 @@ int bcf_enc_vlong(kstring_t *s, const int n, const int64_t *a, int wsize)
2657
2696
s -> l += n * sizeof (int16_t );
2658
2697
} else if (max <= BCF_MAX_BT_INT32 && min >= BCF_MIN_BT_INT32 ){
2659
2698
uint8_t * p ;
2660
- bcf_enc_size (s , wsize , BCF_BT_INT32 );
2661
- ks_resize (s , s -> l + n * sizeof (int32_t ));
2699
+ if (bcf_enc_size (s , wsize , BCF_BT_INT32 ) < 0 ||
2700
+ ks_resize (s , s -> l + n * sizeof (int32_t )) < 0 )
2701
+ return -1 ;
2662
2702
p = (uint8_t * ) s -> s + s -> l ;
2663
2703
for (i = 0 ; i < n ; ++ i ) {
2664
2704
int32_t x ;
@@ -2670,11 +2710,11 @@ int bcf_enc_vlong(kstring_t *s, const int n, const int64_t *a, int wsize)
2670
2710
}
2671
2711
s -> l += n * sizeof (int32_t );
2672
2712
}
2673
- #ifdef VCF_ALLOW_INT64
2713
+ #ifdef VCF_ALLOW_INT64
2674
2714
else {
2675
2715
uint8_t * p ;
2676
- bcf_enc_size (s , wsize , BCF_BT_INT64 );
2677
- ks_resize ( s , s -> l + n * sizeof ( int64_t )) ;
2716
+ if ( bcf_enc_size (s , wsize , BCF_BT_INT64 ) < 0 || ks_resize ( s , s -> l + n * sizeof ( int64_t )) < 0 )
2717
+ return -1 ;
2678
2718
p = (uint8_t * ) s -> s + s -> l ;
2679
2719
for (i = 0 ; i < n ; ++ i ) {
2680
2720
int64_t x = a [i ];
@@ -2688,7 +2728,7 @@ int bcf_enc_vlong(kstring_t *s, const int n, const int64_t *a, int wsize)
2688
2728
#endif
2689
2729
}
2690
2730
2691
- return 0 ; // FIXME: check for errs in this function
2731
+ return 0 ;
2692
2732
}
2693
2733
2694
2734
static inline int serialize_float_array (kstring_t * s , size_t n , const float * a ) {
@@ -3524,7 +3564,7 @@ static int vcf_parse_info(kstring_t *str, const bcf_hdr_t *h, bcf1_t *v, char *p
3524
3564
v -> unpacked |= BCF_IS_64BIT ;
3525
3565
bcf_enc_vlong (str , n_val , a_val , -1 );
3526
3566
val1 = a_val [0 ];
3527
- if (n_val == 1 && strcmp (key , "END" ) == 0 )
3567
+ if (n_val == 1 && strcmp (key , "END" ) == 0 )//memset instead of strcmp
3528
3568
{
3529
3569
if ( val1 <= v -> pos )
3530
3570
{
@@ -3586,6 +3626,7 @@ int vcf_parse(kstring_t *s, const bcf_hdr_t *h, bcf1_t *v)
3586
3626
// Ensure string we parse has space to permit some over-flow when during
3587
3627
// parsing. Eg to do memcmp(key, "END", 4) in vcf_parse_info over
3588
3628
// the more straight forward looking strcmp, giving a speed advantage.
3629
+ /*
3589
3630
if (ks_resize(s, s->l+4) < 0)
3590
3631
return -1;
3591
3632
@@ -3598,7 +3639,7 @@ int vcf_parse(kstring_t *s, const bcf_hdr_t *h, bcf1_t *v)
3598
3639
s->s[s->l+1] = 0;
3599
3640
s->s[s->l+2] = 0;
3600
3641
s->s[s->l+3] = 0;
3601
-
3642
+ */ // commented out the part that was required for optimization in vcf_parse_info function, will take a look later.
3602
3643
bcf_clear1 (v );
3603
3644
str = & v -> shared ;
3604
3645
memset (& aux , 0 , sizeof (ks_tokaux_t ));
@@ -4657,7 +4698,7 @@ int bcf_hdr_parse_required_sample_line(bcf_hdr_t *hdr, char *htxt, size_t* hdr_l
4657
4698
// operations do not really care about a few malformed lines).
4658
4699
// In the future we may want to add a strict mode that errors in
4659
4700
// this case.
4660
- if ( strncmp ("#CHROM\tPOS " ,p ,10 ) != 0 ) {
4701
+ if ( strncmp ("#CHROM\t " ,p ,7 ) && strncmp ( "#CHROM " , p , 7 ) ) {
4661
4702
char * eol = strchr (p , '\n' );
4662
4703
if (* p != '\0' ) {
4663
4704
char buffer [320 ];
0 commit comments