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