X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Funicase%2Fu-suffix-context.h;h=ec12d7d80631ef5fe092d5278f29c82b242ff4ab;hb=2f0357585d836b7349192ea4276b78adfd551cbc;hp=96c58dae933eee9327dc8528cddf42edf7ab0fc5;hpb=9d0578a8df3145ac2a47d1868630c6bbacde9ec6;p=gnulib.git diff --git a/lib/unicase/u-suffix-context.h b/lib/unicase/u-suffix-context.h index 96c58dae9..ec12d7d80 100644 --- a/lib/unicase/u-suffix-context.h +++ b/lib/unicase/u-suffix-context.h @@ -1,5 +1,5 @@ /* Case-mapping context of suffix UTF-8/UTF-16/UTF-32 string. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009-2011 Free Software Foundation, Inc. Written by Bruno Haible , 2009. This program is free software: you can redistribute it and/or modify it @@ -28,7 +28,7 @@ FUNC2 (const UNIT *s, size_t n, casing_suffix_context_t a_context) /* Evaluate all three conditions in a single pass through the string S. The three variables are -1 as long as the value of the condition has not been determined. */ - int scc_FINAL_SIGMA = -1; + ucs4_t first_char_except_ignorable = (ucs4_t)(-1); int scc_MORE_ABOVE = -1; int scc_BEFORE_DOT = -1; const UNIT *s_end = s + n; @@ -38,51 +38,51 @@ FUNC2 (const UNIT *s, size_t n, casing_suffix_context_t a_context) ucs4_t uc; int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s); - if (scc_FINAL_SIGMA < 0) - { - if (uc_is_cased (uc)) - scc_FINAL_SIGMA = SCC_FINAL_SIGMA_MASK; - else if (!uc_is_case_ignorable (uc)) - scc_FINAL_SIGMA = 0; - } + if (first_char_except_ignorable == (ucs4_t)(-1)) + { + if (!uc_is_case_ignorable (uc)) + first_char_except_ignorable = uc; + } if (scc_MORE_ABOVE < 0) - { - int ccc = uc_combining_class (uc); - if (ccc == UC_CCC_A) - scc_MORE_ABOVE = SCC_MORE_ABOVE_MASK; - else if (ccc == UC_CCC_NR) - scc_MORE_ABOVE = 0; - } + { + int ccc = uc_combining_class (uc); + if (ccc == UC_CCC_A) + scc_MORE_ABOVE = SCC_MORE_ABOVE_MASK; + else if (ccc == UC_CCC_NR) + scc_MORE_ABOVE = 0; + } if (scc_BEFORE_DOT < 0) - { - if (uc == 0x0307) /* COMBINING DOT ABOVE */ - scc_BEFORE_DOT = SCC_BEFORE_DOT_MASK; - else - { - int ccc = uc_combining_class (uc); - if (ccc == UC_CCC_A || ccc == UC_CCC_NR) - scc_BEFORE_DOT = 0; - } - } + { + if (uc == 0x0307) /* COMBINING DOT ABOVE */ + scc_BEFORE_DOT = SCC_BEFORE_DOT_MASK; + else + { + int ccc = uc_combining_class (uc); + if (ccc == UC_CCC_A || ccc == UC_CCC_NR) + scc_BEFORE_DOT = 0; + } + } - if ((scc_FINAL_SIGMA | scc_MORE_ABOVE | scc_BEFORE_DOT) >= 0) - /* All conditions have been determined. */ - break; + if (first_char_except_ignorable != (ucs4_t)(-1) + && (scc_MORE_ABOVE | scc_BEFORE_DOT) >= 0) + /* All conditions have been determined. */ + break; s += count; } /* For those conditions that have not been determined so far, use the value from the argument context. */ + context.first_char_except_ignorable = + (first_char_except_ignorable != (ucs4_t)(-1) + ? first_char_except_ignorable + : a_context.first_char_except_ignorable); context.bits = - (scc_FINAL_SIGMA >= 0 - ? scc_FINAL_SIGMA - : a_context.bits & SCC_FINAL_SIGMA_MASK) - | (scc_MORE_ABOVE >= 0 - ? scc_MORE_ABOVE - : a_context.bits & SCC_MORE_ABOVE_MASK) + (scc_MORE_ABOVE >= 0 + ? scc_MORE_ABOVE + : a_context.bits & SCC_MORE_ABOVE_MASK) | (scc_BEFORE_DOT >= 0 ? scc_BEFORE_DOT : a_context.bits & SCC_BEFORE_DOT_MASK);