(root)/
coreutils-9.4/
gnulib-tests/
test-memcasecmp.c
       1  /*
       2   * Copyright (C) 2008-2023 Free Software Foundation, Inc.
       3   * Written by Simon Josefsson and Bruno Haible
       4   *
       5   * This program is free software: you can redistribute it and/or modify
       6   * it under the terms of the GNU General Public License as published by
       7   * the Free Software Foundation, either version 3 of the License, or
       8   * (at your option) any later version.
       9   *
      10   * This program 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
      13   * GNU General Public License for more details.
      14   *
      15   * You should have received a copy of the GNU General Public License
      16   * along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <config.h>
      19  
      20  #include "memcasecmp.h"
      21  
      22  #include <string.h>
      23  
      24  #include "zerosize-ptr.h"
      25  #include "macros.h"
      26  
      27  int
      28  main (void)
      29  {
      30    /* Test equal / not equal distinction.  */
      31    void *page_boundary1 = zerosize_ptr ();
      32    void *page_boundary2 = zerosize_ptr ();
      33    if (page_boundary1 && page_boundary2)
      34      ASSERT (memcasecmp (page_boundary1, page_boundary2, 0) == 0);
      35    ASSERT (memcasecmp ("foo", "foobar", 2) == 0);
      36    ASSERT (memcasecmp ("foo", "foobar", 3) == 0);
      37    ASSERT (memcasecmp ("foo", "foobar", 4) != 0);
      38    ASSERT (memcasecmp ("foo", "bar", 1) != 0);
      39    ASSERT (memcasecmp ("foo", "bar", 3) != 0);
      40  
      41    /* Test less / equal / greater distinction.  */
      42    ASSERT (memcasecmp ("foo", "moo", 4) < 0);
      43    ASSERT (memcasecmp ("moo", "foo", 4) > 0);
      44    ASSERT (memcasecmp ("oomph", "oops", 3) < 0);
      45    ASSERT (memcasecmp ("oops", "oomph", 3) > 0);
      46    ASSERT (memcasecmp ("foo", "foobar", 4) < 0);
      47    ASSERT (memcasecmp ("foobar", "foo", 4) > 0);
      48  
      49    /* Test embedded NULs.  */
      50    ASSERT (memcasecmp ("1\0", "2\0", 2) < 0);
      51    ASSERT (memcasecmp ("2\0", "1\0", 2) > 0);
      52    ASSERT (memcasecmp ("x\0""1", "x\0""2", 3) < 0);
      53    ASSERT (memcasecmp ("x\0""2", "x\0""1", 3) > 0);
      54  
      55    /* The Next x86 OpenStep bug shows up only when comparing 16 bytes
      56       or more and with at least one buffer not starting on a 4-byte boundary.
      57       William Lewis provided this test program.   */
      58    {
      59      char foo[21];
      60      char bar[21];
      61      int i;
      62      for (i = 0; i < 4; i++)
      63        {
      64          char *a = foo + i;
      65          char *b = bar + i;
      66          strcpy (a, "--------01111111");
      67          strcpy (b, "--------10000000");
      68          ASSERT (memcasecmp (a, b, 16) < 0);
      69        }
      70    }
      71  
      72    return 0;
      73  }