(root)/
tar-1.35/
gnu/
c-strcaseeq.h
       1  /* Optimized case-insensitive string comparison in C locale.
       2     Copyright (C) 2001-2002, 2007, 2009-2023 Free Software Foundation, Inc.
       3  
       4     This file is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU Lesser General Public License as
       6     published by the Free Software Foundation; either version 2.1 of the
       7     License, or (at your option) any later version.
       8  
       9     This file is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  /* Written by Bruno Haible <bruno@clisp.org>.  */
      18  
      19  #include "c-strcase.h"
      20  #include "c-ctype.h"
      21  
      22  /* STRCASEEQ allows to optimize string comparison with a small literal string.
      23       STRCASEEQ (s, "UTF-8", 'U','T','F','-','8',0,0,0,0)
      24     is semantically equivalent to
      25       c_strcasecmp (s, "UTF-8") == 0
      26     just faster.  */
      27  
      28  /* Help GCC to generate good code for string comparisons with
      29     immediate strings. */
      30  #if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
      31  
      32  /* Case insensitive comparison of ASCII characters.  */
      33  # if C_CTYPE_ASCII
      34  #  define CASEEQ(other,upper) \
      35       (c_isupper (upper) ? ((other) & ~0x20) == (upper) : (other) == (upper))
      36  # else
      37  #  define CASEEQ(other,upper) \
      38       (c_toupper (other) == (upper))
      39  # endif
      40  
      41  static inline int
      42  strcaseeq9 (const char *s1, const char *s2)
      43  {
      44    return c_strcasecmp (s1 + 9, s2 + 9) == 0;
      45  }
      46  
      47  static inline int
      48  strcaseeq8 (const char *s1, const char *s2, char s28)
      49  {
      50    if (CASEEQ (s1[8], s28))
      51      {
      52        if (s28 == 0)
      53          return 1;
      54        else
      55          return strcaseeq9 (s1, s2);
      56      }
      57    else
      58      return 0;
      59  }
      60  
      61  static inline int
      62  strcaseeq7 (const char *s1, const char *s2, char s27, char s28)
      63  {
      64    if (CASEEQ (s1[7], s27))
      65      {
      66        if (s27 == 0)
      67          return 1;
      68        else
      69          return strcaseeq8 (s1, s2, s28);
      70      }
      71    else
      72      return 0;
      73  }
      74  
      75  static inline int
      76  strcaseeq6 (const char *s1, const char *s2, char s26, char s27, char s28)
      77  {
      78    if (CASEEQ (s1[6], s26))
      79      {
      80        if (s26 == 0)
      81          return 1;
      82        else
      83          return strcaseeq7 (s1, s2, s27, s28);
      84      }
      85    else
      86      return 0;
      87  }
      88  
      89  static inline int
      90  strcaseeq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
      91  {
      92    if (CASEEQ (s1[5], s25))
      93      {
      94        if (s25 == 0)
      95          return 1;
      96        else
      97          return strcaseeq6 (s1, s2, s26, s27, s28);
      98      }
      99    else
     100      return 0;
     101  }
     102  
     103  static inline int
     104  strcaseeq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
     105  {
     106    if (CASEEQ (s1[4], s24))
     107      {
     108        if (s24 == 0)
     109          return 1;
     110        else
     111          return strcaseeq5 (s1, s2, s25, s26, s27, s28);
     112      }
     113    else
     114      return 0;
     115  }
     116  
     117  static inline int
     118  strcaseeq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
     119  {
     120    if (CASEEQ (s1[3], s23))
     121      {
     122        if (s23 == 0)
     123          return 1;
     124        else
     125          return strcaseeq4 (s1, s2, s24, s25, s26, s27, s28);
     126      }
     127    else
     128      return 0;
     129  }
     130  
     131  static inline int
     132  strcaseeq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
     133  {
     134    if (CASEEQ (s1[2], s22))
     135      {
     136        if (s22 == 0)
     137          return 1;
     138        else
     139          return strcaseeq3 (s1, s2, s23, s24, s25, s26, s27, s28);
     140      }
     141    else
     142      return 0;
     143  }
     144  
     145  static inline int
     146  strcaseeq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
     147  {
     148    if (CASEEQ (s1[1], s21))
     149      {
     150        if (s21 == 0)
     151          return 1;
     152        else
     153          return strcaseeq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
     154      }
     155    else
     156      return 0;
     157  }
     158  
     159  static inline int
     160  strcaseeq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
     161  {
     162    if (CASEEQ (s1[0], s20))
     163      {
     164        if (s20 == 0)
     165          return 1;
     166        else
     167          return strcaseeq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
     168      }
     169    else
     170      return 0;
     171  }
     172  
     173  #define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
     174    strcaseeq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
     175  
     176  #else
     177  
     178  #define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
     179    (c_strcasecmp (s1, s2) == 0)
     180  
     181  #endif