Am 24.01.21 um 06:33 schrieb Junio C Hamano: > Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > >> NOT(A && B) is Equivalent to (NOT(A) OR NOT(B)) > > At this level, however, the left one looks much simpler than the > right one ;-) > > >> if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern) && >> - !(!opt->ignore_case && (p->fixed || p->is_fixed))) >> + (opt->ignore_case || !(p->fixed || p->is_fixed))) >> options |= PCRE2_UTF; > > In the context of this expression, well, I guess the rewritten one > is probably simpler but can we explain the whole condition in fewer > than three lines? With or without the rewrite, it still looks too > complicated to me. Make the condition if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern) && (opt->ignore_case || (!p->fixed && !p->is_fixed))) { options |= PCRE2_UTF; } With the knowledge of the equivalence (A => B) <=> (NOT(A) OR B) (A => B means "if A then B"), the condition makes a lot of sense when read aloud: if NOT ignore locale AND is UTF8 AND has non-ASCII AND if NOT ignore case then if also NOT fixed AND NOT is fixed then ... The codition amounts to extending a series of conjunctions with more conjuctions IF a condition is satisfied. That's quite sensible. You have to swap the polarity of the first condition of || in your head, though, to achieve that meaning. That works with every OR condition, BTW. -- Hannes