(root)/
glibc-2.38/
string/
bug-strcoll2.c
       1  /* Bug 18589: sort-test.sh fails at random.
       2     Copyright (C) 2015-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <stdio.h>
      20  #include <string.h>
      21  #include <locale.h>
      22  
      23  /* An incorrect strcoll optimization resulted in incorrect
      24     results from strcoll for cs_CZ and da_DK.  */
      25  
      26  int
      27  test_cs_CZ (void)
      28  {
      29    const char t1[] = "config";
      30    const char t2[] = "choose";
      31    if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL)
      32      {
      33        perror ("setlocale");
      34        return 1;
      35      }
      36    /* In Czech the digraph ch sorts after c, therefore we expect
      37       config to sort before choose.  */
      38    int a = strcoll (t1, t2);
      39    int b = strcoll (t2, t1);
      40    printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a);
      41    printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b);
      42    if (a < 0 && b > 0)
      43      {
      44        puts ("PASS: config < choose");
      45        return 0;
      46      }
      47    else
      48      {
      49        puts ("FAIL: Wrong sorting in cs_CZ.UTF-8.");
      50        return 1;
      51      }
      52  }
      53  
      54  int
      55  test_da_DK (void)
      56  {
      57    const char t1[] = "AS";
      58    const char t2[] = "AA";
      59    if (setlocale (LC_ALL, "da_DK.ISO-8859-1") == NULL)
      60      {
      61        perror ("setlocale");
      62        return 1;
      63      }
      64    /* AA should be treated as the last letter of the Danish alphabet,
      65       hence sorting after AS.  */
      66    int a = strcoll (t1, t2);
      67    int b = strcoll (t2, t1);
      68    printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a);
      69    printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b);
      70    if (a < 0 && b > 0)
      71      {
      72        puts ("PASS: AS < AA");
      73        return 0;
      74      }
      75    else
      76      {
      77        puts ("FAIL: Wrong sorting in da_DK.ISO-8859-1");
      78        return 1;
      79      }
      80  }
      81  
      82  int
      83  do_test (void)
      84  {
      85    int err = 0;
      86    err |= test_cs_CZ ();
      87    err |= test_da_DK ();
      88    return err;
      89  }
      90  
      91  #include <support/test-driver.c>