(root)/
tar-1.35/
gnu/
streq.h
       1  /* Optimized string comparison.
       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  #ifndef _GL_STREQ_H
      20  #define _GL_STREQ_H
      21  
      22  #include <string.h>
      23  
      24  /* STREQ_OPT allows to optimize string comparison with a small literal string.
      25       STREQ_OPT (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
      26     is semantically equivalent to
      27       strcmp (s, "EUC-KR") == 0
      28     just faster.  */
      29  
      30  /* Help GCC to generate good code for string comparisons with
      31     immediate strings. */
      32  #if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
      33  
      34  static inline int
      35  streq9 (const char *s1, const char *s2)
      36  {
      37    return strcmp (s1 + 9, s2 + 9) == 0;
      38  }
      39  
      40  static inline int
      41  streq8 (const char *s1, const char *s2, char s28)
      42  {
      43    if (s1[8] == s28)
      44      {
      45        if (s28 == 0)
      46          return 1;
      47        else
      48          return streq9 (s1, s2);
      49      }
      50    else
      51      return 0;
      52  }
      53  
      54  static inline int
      55  streq7 (const char *s1, const char *s2, char s27, char s28)
      56  {
      57    if (s1[7] == s27)
      58      {
      59        if (s27 == 0)
      60          return 1;
      61        else
      62          return streq8 (s1, s2, s28);
      63      }
      64    else
      65      return 0;
      66  }
      67  
      68  static inline int
      69  streq6 (const char *s1, const char *s2, char s26, char s27, char s28)
      70  {
      71    if (s1[6] == s26)
      72      {
      73        if (s26 == 0)
      74          return 1;
      75        else
      76          return streq7 (s1, s2, s27, s28);
      77      }
      78    else
      79      return 0;
      80  }
      81  
      82  static inline int
      83  streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
      84  {
      85    if (s1[5] == s25)
      86      {
      87        if (s25 == 0)
      88          return 1;
      89        else
      90          return streq6 (s1, s2, s26, s27, s28);
      91      }
      92    else
      93      return 0;
      94  }
      95  
      96  static inline int
      97  streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
      98  {
      99    if (s1[4] == s24)
     100      {
     101        if (s24 == 0)
     102          return 1;
     103        else
     104          return streq5 (s1, s2, s25, s26, s27, s28);
     105      }
     106    else
     107      return 0;
     108  }
     109  
     110  static inline int
     111  streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
     112  {
     113    if (s1[3] == s23)
     114      {
     115        if (s23 == 0)
     116          return 1;
     117        else
     118          return streq4 (s1, s2, s24, s25, s26, s27, s28);
     119      }
     120    else
     121      return 0;
     122  }
     123  
     124  static inline int
     125  streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
     126  {
     127    if (s1[2] == s22)
     128      {
     129        if (s22 == 0)
     130          return 1;
     131        else
     132          return streq3 (s1, s2, s23, s24, s25, s26, s27, s28);
     133      }
     134    else
     135      return 0;
     136  }
     137  
     138  static inline int
     139  streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
     140  {
     141    if (s1[1] == s21)
     142      {
     143        if (s21 == 0)
     144          return 1;
     145        else
     146          return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
     147      }
     148    else
     149      return 0;
     150  }
     151  
     152  static inline int
     153  streq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
     154  {
     155    if (s1[0] == s20)
     156      {
     157        if (s20 == 0)
     158          return 1;
     159        else
     160          return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
     161      }
     162    else
     163      return 0;
     164  }
     165  
     166  #define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
     167    streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
     168  
     169  #else
     170  
     171  #define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
     172    (strcmp (s1, s2) == 0)
     173  
     174  #endif
     175  
     176  #endif /* _GL_STREQ_H */