| line | true | false | branch | 
 
| 26 | 2111676 | 0 | if (ofs) { | 
 
| 28 | 2108358 | 3318 | if (utf8_default) { | 
 
| 40 | 18 | 2111658 | if (is_utf8 > 1) { | 
 
| 44 | 3540 | 2108118 | if (is_utf8) { | 
 
| 48 | 2108118 | 0 | if (ptr) { | 
 
| 60 | 270 | 905004 | if (index >= mph->num_buckets) { | 
 
| 65 | 0 | 905004 | if (val_sv) { | 
 
| 69 | 905004 | 0 | if (key_sv) { | 
 
| 92 | 1992 | 1204680 | if (SvUTF8(key_sv)) { | 
 
| 97 | 1206672 | 0 | key_pv= SvPV(key_sv,key_len); | 
 
| 103 | 0 | 1206672 | if (!bucket->xor_val) | 
 
| 107 | 444320 | 762352 | if ( bucket->index < 0 ) { | 
 
| 114 | 1206672 | 0 | if (bucket->key_len == key_len && memEQ(key_pv,got_key_pv,key_len)) { | 
 
|  | 1206672 | 0 | if (bucket->key_len == key_len && memEQ(key_pv,got_key_pv,key_len)) { | 
 
| 115 | 1206672 | 0 | if (val_sv) { | 
 
| 133 | 366 | 0 | if (error) | 
 
| 135 | 0 | 366 | if (fd < 0) { | 
 
| 136 | 0 | 0 | if (error) | 
 
| 140 | 0 | 366 | if (fstat(fd,&st)==-1) { | 
 
| 141 | 0 | 0 | if (error) | 
 
| 145 | 0 | 366 | if (st.st_size < sizeof(struct mph_header)) { | 
 
| 146 | 0 | 0 | if (error) | 
 
| 151 | 0 | 366 | if (ptr == MAP_FAILED) { | 
 
| 152 | 0 | 0 | if (error) | 
 
| 160 | 5 | 361 | if (head->magic_num != MAGIC_DECIMAL) { | 
 
| 161 | 0 | 5 | if (head->magic_num == MAGIC_BIG_ENDIAN_DECIMAL) { | 
 
| 162 | 0 | 0 | if (error) | 
 
| 165 | 5 | 0 | if (error) | 
 
| 169 | 1 | 360 | if (head->variant < MIN_VARIANT) { | 
 
| 170 | 1 | 0 | if (error) | 
 
| 174 | 3 | 357 | if (head->variant > MAX_VARIANT) { | 
 
| 175 | 3 | 0 | if (error) | 
 
| 181 | 0 | 357 | if (st.st_size % alignment) { | 
 
| 182 | 0 | 0 | if (error) | 
 
| 186 | 353 | 4 | if ( | 
 
| 187 | 350 | 3 | head->table_ofs < head->state_ofs           || | 
 
| 188 | 346 | 4 | head->key_flags_ofs < head->table_ofs       || | 
 
| 189 | 343 | 3 | head->val_flags_ofs < head->key_flags_ofs   || | 
 
| 190 | 4 | 339 | head->str_buf_ofs < head->val_flags_ofs     || | 
 
| 193 | 18 | 0 | if (error) | 
 
| 197 | 249 | 90 | if (flags & MPH_F_VALIDATE) { | 
 
| 205 | 158 | 91 | if (have_file_checksum != want_file_checksum) { | 
 
| 206 | 158 | 0 | if (error) | 
 
| 224 | 1 | 603401 | if (SvROK(sv)) { | 
 
| 228 | 0 | 603401 | if (SvOK(sv)) { | 
 
|  | 0 | 0 | if (SvOK(sv)) { | 
 
|  | 0 | 0 | if (SvOK(sv)) { | 
 
| 230 | 553225 | 50176 | char *pv= SvPV(sv,pv_len); | 
 
| 231 | 1 | 603400 | if (pv_len > 0xFFFF) | 
 
| 233 | 1030 | 602370 | if (SvUTF8(sv)) { | 
 
| 234 | 506 | 524 | if (downgrade) | 
 
| 236 | 1021 | 9 | if (SvUTF8(normalized_sv)) { | 
 
| 253 | 246 | 300 | if (r) { | 
 
| 279 | 301701 | 93 | while (he= hv_iternext(source_hv)) { | 
 
| 292 | 0 | 301701 | if (!val_sv) croak("panic: no sv for value?"); | 
 
| 293 | 0 | 301701 | if (!SvOK(val_sv) && (compute_flags & MPH_F_FILTER_UNDEF)) continue; | 
 
|  | 0 | 0 | if (!SvOK(val_sv) && (compute_flags & MPH_F_FILTER_UNDEF)) continue; | 
 
|  | 0 | 0 | if (!SvOK(val_sv) && (compute_flags & MPH_F_FILTER_UNDEF)) continue; | 
 
|  | 0 | 0 | if (!SvOK(val_sv) && (compute_flags & MPH_F_FILTER_UNDEF)) continue; | 
 
| 316 | 301699 | 0 | key_pv= (U8 *)SvPV(key_normalized_sv,key_len); | 
 
| 321 | 93 | 0 | if (buf_length_sv) | 
 
| 332 | 301697 | 93 | for (i=0; i | 
 
| 343 | 301697 | 0 | if (!got_psv || !SvROK(*got_psv)) croak("panic: bad item in keys_av"); | 
 
|  | 0 | 301697 | if (!got_psv || !SvROK(*got_psv)) croak("panic: bad item in keys_av"); | 
 
| 346 | 0 | 301697 | if (!h0_he) croak("panic: no h0_he?"); | 
 
| 348 | 150610 | 151087 | h0= SvUV(h0_sv); | 
 
| 354 | 0 | 301697 | if (!got_psv) | 
 
| 356 | 190769 | 110928 | if (!SvPOK(*got_psv)) | 
 
| 361 | 0 | 301697 | if (!got_psv) | 
 
| 364 | 190769 | 110928 | if (!SvROK(*got_psv)) { | 
 
| 382 | 301650 | 93 | for( i = 0 ; i < keybuckets_count ; i++ ) { | 
 
| 388 | 110881 | 190769 | if (!got) continue; | 
 
| 391 | 0 | 190769 | if (len<1) continue; | 
 
| 394 | 190462 | 307 | if (SvPOK(*got)) { | 
 
| 411 | 0 | 190769 | if (!buckets_rvp) croak("panic: out of memory in buckets_av lvalue fetch"); | 
 
| 412 | 80961 | 109808 | if (!SvROK(*buckets_rvp)) { | 
 
| 414 | 0 | 80961 | if (!idx1_hv) croak("panic: out of memory creating new hash in buckets_av idx %u",idx1); | 
 
| 422 | 190769 | 0 | hv_setuv_with_keysv(idx1_hv,MPH_KEYSV_XOR_VAL,xor_val); | 
 
| 423 | 190769 | 0 | hv_setuv_with_keysv(idx1_hv,MPH_KEYSV_H1_KEYS,keys_in_bucket_count); | 
 
| 426 | 301697 | 190769 | for (i= 0, idx2= idx_start; i < keys_in_bucket_count; i++,idx2++) { | 
 
| 434 | 0 | 301697 | if (!keys_rvp) croak("panic: no key_info in bucket %d", i); | 
 
| 438 | 0 | 301697 | if (!buckets_rvp) croak("panic: out of memory in lvalue fetch to buckets_av"); | 
 
| 440 | 220736 | 80961 | if (!SvROK(*buckets_rvp)) { | 
 
| 445 | 80961 | 0 | hv_copy_with_keysv(idx2_hv,keys_hv,MPH_KEYSV_XOR_VAL); | 
 
| 446 | 80961 | 0 | hv_copy_with_keysv(idx2_hv,keys_hv,MPH_KEYSV_H1_KEYS); | 
 
| 454 | 301697 | 0 | hv_setuv_with_keysv(keys_hv,MPH_KEYSV_IDX,*idx2); | 
 
| 463 | 214 | 0 | U32 *idx1_start= (U32 *)SvPV(idx1_packed_sv,idx1_packed_sv_len); | 
 
| 467 | 79675 | 214 | for (idx1_ptr= idx1_start; idx1_ptr < idx1_end; idx1_ptr++) { | 
 
| 479 | 0 | 79675 | if (!got) | 
 
| 484 | 0 | 79675 | if (!got) | 
 
| 488 | 79675 | 0 | h2_start= (U32 *)SvPV(h2_sv,h2_strlen); | 
 
| 496 | 0 | 245058 | if (xor_val == max_xor_val) { | 
 
| 498 | 0 | 0 | while (h2_ptr < h2_end) | 
 
| 504 | 418989 | 79675 | while (h2_ptr < h2_end) { | 
 
| 508 | 165319 | 253670 | if (is_used[idx2]) | 
 
| 510 | 155795 | 253606 | for (check_idx= idx2_start; check_idx < idx2_ptr; check_idx++) { | 
 
| 511 | 64 | 155731 | if (*check_idx == idx2) | 
 
| 528 | 93 | 0 | U32 *idx1_start= (U32 *)SvPV(idx1_packed_sv,idx1_packed_sv_len); | 
 
| 534 | 111094 | 93 | for (idx1_ptr= idx1_start; idx1_ptr < idx1_end; idx1_ptr++) { | 
 
| 540 | 412524 | 0 | while (singleton_pos < bucket_count && is_used[singleton_pos]) { | 
 
|  | 301430 | 111094 | while (singleton_pos < bucket_count && is_used[singleton_pos]) { | 
 
| 543 | 0 | 111094 | if (singleton_pos == bucket_count) { | 
 
| 550 | 0 | 111094 | if (!got) | 
 
| 573 | 0 | 93 | Newxz(idx2_start, av_top_index(by_length_av)+1, U32); | 
 
| 577 | 325 | 93 | for (len_idx= av_top_index(by_length_av); len_idx > 0 && !bad_idx; len_idx--) { | 
 
|  | 325 | 0 | for (len_idx= av_top_index(by_length_av); len_idx > 0 && !bad_idx; len_idx--) { | 
 
| 582 | 307 | 18 | if (!idx1_packed_sv || !SvPOK(*idx1_packed_sv)) | 
 
|  | 0 | 307 | if (!idx1_packed_sv || !SvPOK(*idx1_packed_sv)) | 
 
| 585 | 93 | 214 | if (len_idx == 1) { | 
 
| 659 | 3 | 0 | U8 *str_pv= (U8 *)SvPV(str_sv,str_len); | 
 
| 660 | 3 | 0 | state_pv= (U8 *)SvPV(state_sv,state_len); | 
 
| 661 | 0 | 3 | if (state_len != MPH_STATE_BYTES) { | 
 
| 681 | 0 | 96 | if (!SvOK(base_seed_sv)) | 
 
|  | 0 | 0 | if (!SvOK(base_seed_sv)) | 
 
|  | 0 | 0 | if (!SvOK(base_seed_sv)) | 
 
| 683 | 0 | 96 | if (SvROK(base_seed_sv)) | 
 
| 686 | 96 | 0 | seed_pv= (U8 *)SvPV(seed_sv,seed_len); | 
 
| 688 | 0 | 96 | if (seed_len != MPH_SEED_BYTES) { | 
 
| 689 | 0 | 0 | if (SvREADONLY(base_seed_sv)) { | 
 
| 690 | 0 | 0 | if (seed_len < MPH_SEED_BYTES) { | 
 
| 694 | 0 | 0 | else if (seed_len > MPH_SEED_BYTES) { | 
 
| 700 | 0 | 0 | if (seed_len < MPH_SEED_BYTES) { | 
 
| 702 | 0 | 0 | while (seed_len < MPH_SEED_BYTES) { | 
 
| 708 | 0 | 0 | seed_pv= (U8 *)SvPV(seed_sv,seed_len); | 
 
| 716 | 96 | 0 | state_pv= (U8 *)SvPV(RETVAL,state_len); | 
 
| 759 | 95 | 0 | if (he) { | 
 
| 760 | 0 | 95 | variant= SvUV(HeVAL(he)); | 
 
| 766 | 95 | 0 | if (he) { | 
 
| 767 | 0 | 95 | compute_flags= SvUV(HeVAL(he)); | 
 
| 773 | 95 | 0 | if (he) { | 
 
| 775 | 95 | 0 | state_pv= (U8 *)SvPV(state_sv,state_len); | 
 
| 776 | 0 | 95 | if (state_len != MPH_STATE_BYTES) { | 
 
| 784 | 95 | 0 | if (he) { | 
 
| 791 | 95 | 0 | if (he) { | 
 
| 798 | 95 | 0 | if (he) { | 
 
| 800 | 0 | 95 | if (SvROK(rv)) { | 
 
| 821 | 46 | 47 | if (compute_flags & MPH_F_DETERMINISTIC) | 
 
| 864 | 0 | 91 | U32 buf_length= SvUV(buf_length_sv); | 
 
| 868 | 91 | 0 | char *state_pv= SvPV(state_sv, state_len); | 
 
| 875 | 0 | 91 | U32 str_rlen= _roundup( buf_length | 
 
| 877 | 0 | 0 | + ( SvOK(comment_sv) ? sv_len(comment_sv) + 1 : 1 ) | 
 
|  | 0 | 0 | + ( SvOK(comment_sv) ? sv_len(comment_sv) + 1 : 1 ) | 
 
| 903 | 301673 | 91 | for (i= 0; i < bucket_count; i++) { | 
 
| 908 | 0 | 301673 | key_is_utf8_count[SvUV(HeVAL(key_is_utf8_he))]++; | 
 
| 909 | 0 | 301673 | val_is_utf8_count[SvUV(HeVAL(val_is_utf8_he))]++; | 
 
| 912 | 73 | 18 | if (key_is_utf8_count[0]) { the_flag= 0; used_flags++; } | 
 
| 913 | 42 | 49 | if (key_is_utf8_count[1]) { the_flag= 1; used_flags++; } | 
 
| 914 | 6 | 85 | if (key_is_utf8_count[2]) { the_flag= 2; used_flags++; } | 
 
| 915 | 67 | 24 | if (used_flags == 1) { | 
 
| 920 | 73 | 18 | if (val_is_utf8_count[0]) { the_flag= 0; used_flags++; } | 
 
| 921 | 42 | 49 | if (val_is_utf8_count[1]) { the_flag= 1; used_flags++; } | 
 
| 922 | 67 | 24 | if (used_flags == 1) { | 
 
| 952 | 67 | 24 | if (val_is_utf8_generic >= 0) | 
 
| 954 | 67 | 24 | if (key_is_utf8_generic >= 0) | 
 
| 966 | 91 | 0 | pv= SvPV(comment_sv,pv_len); | 
 
| 970 | 301673 | 91 | for (i= 0; i < bucket_count; i++) { | 
 
| 977 | 190752 | 110921 | if (xor_val_he) { | 
 
| 978 | 0 | 190752 | table[i].xor_val= SvUV(HeVAL(xor_val_he)); | 
 
| 982 | 301673 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 301673 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 301673 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 301673 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 301673 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 301673 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 301673 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 301673 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 301673 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 301673 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 301673 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 301673 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 301673 | 0 | SETOFS(i,key_normalized_he,table,key_ofs,key_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
| 983 | 301673 | 0 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 301673 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 0 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 0 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 301673 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 301673 | 0 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 301673 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 301673 | 0 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 485 | 301188 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 485 | 0 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 485 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 301188 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 485 | 0 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 485 | 0 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 0 | 485 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
|  | 485 | 0 | SETOFS(i,val_normalized_he,table,val_ofs,val_len,str_buf_start,str_buf_pos,str_buf_end,str_ofs_hv); | 
 
| 984 | 474 | 301199 | if ( key_is_utf8_generic < 0) { | 
 
| 986 | 474 | 0 | if (key_is_utf8_he) { | 
 
| 987 | 0 | 474 | UV u= SvUV(HeVAL(key_is_utf8_he)); | 
 
| 993 | 474 | 301199 | if ( val_is_utf8_generic < 0 ) { | 
 
| 995 | 474 | 0 | if (val_is_utf8_he) { | 
 
| 996 | 0 | 474 | UV u= SvUV(HeVAL(val_is_utf8_he)); | 
 
| 1007 | 88 | 3 | if (r) { | 
 
| 1031 | 366 | 0 | char *file_pv= SvPV(file_sv,file_len); | 
 
| 1033 | 185 | 181 | if (mmap_status < 0) { | 
 
| 1050 | 181 | 0 | struct mph_obj *obj= (struct mph_obj *)SvPV_nolen(mount_sv); | 
 
| 1052 | 0 | 181 | SvOK_off(mount_sv); | 
 
| 1063 | 905274 | 0 | struct mph_obj *obj= (struct mph_obj *)SvPV_nolen(mount_sv); | 
 
| 1064 | 905274 | 0 | SV* key_sv= items > 2 ? ST(2) : NULL; | 
 
| 1065 | 0 | 905274 | SV* val_sv= items > 3 ? ST(3) : NULL; | 
 
| 1066 | 0 | 905274 | if (items > 4) | 
 
| 1081 | 1206672 | 0 | SV* val_sv= items > 2 ? ST(2) : NULL; | 
 
| 1082 | 1206672 | 0 | struct mph_obj *obj= (struct mph_obj *)SvPV_nolen(mount_sv); | 
 
| 1083 | 0 | 1206672 | if (items > 3) | 
 
| 1116 | 0 | 1440 | if (!got) | 
 
| 1119 | 1440 | 0 | if (!mount_sv || !SvPOK(mount_sv)) | 
 
|  | 0 | 1440 | if (!mount_sv || !SvPOK(mount_sv)) | 
 
| 1121 | 1440 | 0 | obj= (struct mph_obj *)SvPV_nolen(mount_sv); |