(root)/
coreutils-9.4/
gnulib-tests/
test-memchr2.c
       1  /*
       2   * Copyright (C) 2008-2023 Free Software Foundation, Inc.
       3   * Written by Eric Blake
       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 "memchr2.h"
      21  
      22  #include <stdlib.h>
      23  #include <string.h>
      24  
      25  #include "zerosize-ptr.h"
      26  #include "macros.h"
      27  
      28  /* Calculating void * + int is not portable, so this wrapper converts
      29     to char * to make the tests easier to write.  */
      30  #define MEMCHR2 (char *) memchr2
      31  
      32  int
      33  main (void)
      34  {
      35    size_t n = 0x100000;
      36    char *input = malloc (n);
      37    ASSERT (input);
      38  
      39    input[0] = 'a';
      40    input[1] = 'b';
      41    memset (input + 2, 'c', 1024);
      42    memset (input + 1026, 'd', n - 1028);
      43    input[n - 2] = 'e';
      44    input[n - 1] = 'a';
      45  
      46    /* Basic behavior tests.  */
      47    ASSERT (MEMCHR2 (input, 'a', 'b', n) == input);
      48    ASSERT (MEMCHR2 (input, 'b', 'a', n) == input);
      49  
      50    ASSERT (MEMCHR2 (input, 'a', 'b', 0) == NULL);
      51    void *page_boundary = zerosize_ptr ();
      52    if (page_boundary)
      53      ASSERT (MEMCHR2 (page_boundary, 'a', 'b', 0) == NULL);
      54  
      55    ASSERT (MEMCHR2 (input, 'b', 'd', n) == input + 1);
      56    ASSERT (MEMCHR2 (input + 2, 'b', 'd', n - 2) == input + 1026);
      57  
      58    ASSERT (MEMCHR2 (input, 'd', 'e', n) == input + 1026);
      59    ASSERT (MEMCHR2 (input, 'e', 'd', n) == input + 1026);
      60  
      61    ASSERT (MEMCHR2 (input + 1, 'a', 'e', n - 1) == input + n - 2);
      62    ASSERT (MEMCHR2 (input + 1, 'e', 'a', n - 1) == input + n - 2);
      63  
      64    ASSERT (MEMCHR2 (input, 'f', 'g', n) == NULL);
      65    ASSERT (MEMCHR2 (input, 'f', '\0', n) == NULL);
      66  
      67    ASSERT (MEMCHR2 (input, 'a', 'a', n) == input);
      68    ASSERT (MEMCHR2 (input + 1, 'a', 'a', n - 1) == input + n - 1);
      69    ASSERT (MEMCHR2 (input, 'f', 'f', n) == NULL);
      70  
      71    /* Check that a very long haystack is handled quickly if one of the
      72       two bytes is found near the beginning.  */
      73    {
      74      size_t repeat = 10000;
      75      for (; repeat > 0; repeat--)
      76        {
      77          ASSERT (MEMCHR2 (input, 'c', 'e', n) == input + 2);
      78          ASSERT (MEMCHR2 (input, 'e', 'c', n) == input + 2);
      79          ASSERT (MEMCHR2 (input, 'c', '\0', n) == input + 2);
      80          ASSERT (MEMCHR2 (input, '\0', 'c', n) == input + 2);
      81        }
      82    }
      83  
      84    /* Alignment tests.  */
      85    {
      86      int i, j;
      87      for (i = 0; i < 32; i++)
      88        {
      89          for (j = 0; j < 256; j++)
      90            input[i + j] = j;
      91          for (j = 0; j < 256; j++)
      92            {
      93              ASSERT (MEMCHR2 (input + i, j, 0xff, 256) == input + i + j);
      94              ASSERT (MEMCHR2 (input + i, 0xff, j, 256) == input + i + j);
      95            }
      96        }
      97    }
      98  
      99    free (input);
     100  
     101    return 0;
     102  }