(root)/
tar-1.35/
gnu/
hard-locale.c
       1  /* hard-locale.c -- Determine whether a locale is hard.
       2  
       3     Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2023 Free Software
       4     Foundation, Inc.
       5  
       6     This file is free software: you can redistribute it and/or modify
       7     it under the terms of the GNU Lesser General Public License as
       8     published by the Free Software Foundation; either version 2.1 of the
       9     License, or (at your option) any later version.
      10  
      11     This file is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU Lesser General Public License for more details.
      15  
      16     You should have received a copy of the GNU Lesser General Public License
      17     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <config.h>
      20  
      21  #include "hard-locale.h"
      22  
      23  #include <locale.h>
      24  #include <stdlib.h>
      25  #include <string.h>
      26  
      27  bool
      28  hard_locale (int category)
      29  {
      30    char locale[SETLOCALE_NULL_MAX];
      31  
      32    if (setlocale_null_r (category, locale, sizeof (locale)))
      33      return false;
      34  
      35    if (!(strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0))
      36      return true;
      37  
      38  #if defined __ANDROID__
      39    /* On Android 5.0 or newer, it is possible to set a locale that has the same
      40       name as the "C" locale but in fact uses UTF-8 encoding.  Cf. test case 2 in
      41       <https://lists.gnu.org/archive/html/bug-gnulib/2023-01/msg00141.html>.  */
      42    if (MB_CUR_MAX > 1)
      43      return true;
      44  #endif
      45  
      46    return false;
      47  }