Changeset 130 for trunk/src


Ignore:
Timestamp:
May 4, 2008, 11:58:04 AM (11 years ago)
Author:
cameron
Message:

Add FFFF/FFFE detection to UTF-8 validation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bitlex.c

    r129 r130  
    556556        BitBlock prefix_pending = simd_const_1(0);
    557557        /*  If a suffix is pending, then it may involve one of
    558             the special case prefixes E0, ED. F0, F4. */
     558            the special case prefixes E0, ED. F0, F4, or the
     559            EF prefix or EF_BF combination for FFFF/FFFE detection.*/
    559560        BitBlock E0ED_pending = simd_const_1(0);
    560561        BitBlock F0F4_pending = simd_const_1(0);
    561562        BitBlock bit5_pending = simd_const_1(0);
     563        BitBlock EF_pending = simd_const_1(0);
     564        BitBlock EF_BF_pending = simd_const_1(0);
    562565
    563566        /* Temporary variables used within the block. */
     
    565568        BitBlock prefix_E0ED, E0ED_scope, bit5_scope, E0ED_constraint; 
    566569        BitBlock prefix_F5FF, prefix_F0F4, F0F4_scope, F0F4_constraint;
     570        BitBlock X111x, B111x, prefix_EF, BF, EF_BF, EF_scope, EF_BF_scope;
    567571
    568572        for (int i = 0; i < buffer_blocks; i++) {
     
    590594                F0F4_scope = F0F4_pending;
    591595                bit5_scope = bit5_pending;
     596                EF_scope = EF_pending;
     597                EF_BF_scope = EF_BF_pending;
     598
     599                /* Default values of pending variables for next iteration. */
    592600                E0ED_pending = simd_const_1(0);
    593601                F0F4_pending = simd_const_1(0);
    594602                bit5_pending = simd_const_1(0);
     603                EF_pending = simd_const_1(0);
     604                EF_BF_pending = simd_const_1(0);
     605
     606                X111x = simd_and(simd_and(x8basis[i].bit[4], x8basis[i].bit[5]), x8basis[i].bit[6]);
     607                B111x = simd_and(simd_and(u8suffix, simd_and(x8basis[i].bit[2], x8basis[i].bit[3])),
     608                                 X111x);
     609                BF = simd_and(B111x, x8basis[i].bit[7]);
     610                EF_BF = simd_and(EF_scope, BF);
    595611
    596612                if (bitblock_has_bit(u8prefix3or4)) {
     
    598614                        suffix_required_scope = simd_or(suffix_required_scope,
    599615                                                        sisd_sfli(u8prefix3or4, 2));
    600                         prefix_pending = simd_or(prefix_pending,
    601                                                  sisd_sbli(u8prefix3or4, BLOCKSIZE - 2));
    602616                        bit5_scope = simd_or(bit5_scope, sisd_sfli(x8basis[i].bit[5], 1));
    603                         bit5_pending = sisd_sbli(x8basis[i].bit[5], BLOCKSIZE - 1);
    604617                        prefix_E0ED = simd_andc(u8prefix3,
    605618                                                simd_or(simd_or(x8basis[i].bit[6],
     
    607620                                                        simd_xor(x8basis[i].bit[4], x8basis[i].bit[5])));
    608621                        E0ED_scope = simd_or(E0ED_scope, sisd_sfli(prefix_E0ED, 1));
     622                        prefix_EF = simd_and(u8prefix3, simd_and(X111x, x8basis[i].bit[7]));
     623                        EF_scope = simd_or(EF_scope, sisd_sfli(prefix_EF, 1));
     624                        EF_BF = simd_and(EF_scope, BF);
     625
     626                        /* Values for next iteration. */
     627                        prefix_pending = simd_or(prefix_pending,
     628                                                 sisd_sbli(u8prefix3or4, BLOCKSIZE - 2));
     629                        bit5_pending = sisd_sbli(x8basis[i].bit[5], BLOCKSIZE - 1);
    609630                        E0ED_pending = sisd_sbli(prefix_E0ED, BLOCKSIZE - 1);
     631                        EF_pending = sisd_sbli(prefix_EF, BLOCKSIZE - 1);
     632                        EF_BF_pending = sisd_sbli(EF_BF, BLOCKSIZE - 2);
    610633                        if (bitblock_has_bit(u8prefix4)) {
    611634                                /*  Extend validation for errors in four-byte sequences. */
     
    628651                E0ED_constraint = simd_xor(bit5_scope, x8basis[i].bit[2]);
    629652                error_mask = simd_or(error_mask, simd_andc(E0ED_scope, E0ED_constraint));
    630 #ifdef DEBUG_UTF8_VALIDATION
    631                 print_bit_block("error_mask at E0ED", error_mask);
    632 #endif
    633653                F0F4_constraint = simd_xor(bit5_scope,
    634654                                           simd_or(x8basis[i].bit[2], x8basis[i].bit[3]));
    635655                error_mask = simd_or(error_mask, simd_andc(F0F4_scope, F0F4_constraint));
    636 #ifdef DEBUG_UTF8_VALIDATION
    637                 print_bit_block("error_mask at F0F4", error_mask);
    638 #endif
    639656                /*  Complete validation by checking for prefix-suffix mismatches. */
    640657                error_mask = simd_or(error_mask, simd_xor(suffix_required_scope, u8suffix));
    641 #ifdef DEBUG_UTF8_VALIDATION
    642                 print_bit_block("error_mask at suffix_match", error_mask);
    643 #endif
     658
     659                EF_BF_scope = simd_or(EF_BF_scope, sisd_sfli(EF_BF, 1));
     660                error_mask = simd_or(error_mask, simd_and(EF_BF_scope, B111x));
    644661                validation_stream[i] = error_mask;
    645662#ifdef DEBUG_UTF8_VALIDATION
Note: See TracChangeset for help on using the changeset viewer.