(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
graphite/
id-pr45230-1.c
       1  /* Copyright (C) 2002  Free Software Foundation.
       2  
       3     Test strncmp with various combinations of pointer alignments and lengths to
       4     make sure any optimizations in the library are correct.
       5  
       6     Written by Michael Meissner, March 9, 2002.  */
       7  
       8  #include <string.h>
       9  #include <stddef.h>
      10  
      11  #ifndef MAX_OFFSET
      12  #define MAX_OFFSET (sizeof (long long))
      13  #endif
      14  
      15  #ifndef MAX_TEST
      16  #define MAX_TEST (8 * sizeof (long long))
      17  #endif
      18  
      19  #ifndef MAX_EXTRA
      20  #define MAX_EXTRA (sizeof (long long))
      21  #endif
      22  
      23  #define MAX_LENGTH (MAX_OFFSET + MAX_TEST + MAX_EXTRA)
      24  
      25  static union {
      26    unsigned char buf[MAX_LENGTH];
      27    long long align_int;
      28    long double align_fp;
      29  } u1, u2;
      30  
      31  void
      32  test (const unsigned char *s1, const unsigned char *s2, size_t len, int expected)
      33  {
      34    int value = strncmp ((char *) s1, (char *) s2, len);
      35  
      36    if (expected < 0 && value >= 0)
      37      __builtin_abort ();
      38    else if (expected == 0 && value != 0)
      39      __builtin_abort ();
      40    else if (expected > 0 && value <= 0)
      41      __builtin_abort ();
      42  }
      43  
      44  int
      45  main ()
      46  {
      47    size_t off1, off2, len, i;
      48    unsigned char *buf1, *buf2;
      49    unsigned char *mod1, *mod2;
      50    unsigned char *p1, *p2;
      51  
      52    for (off1 = 0; off1 < MAX_OFFSET; off1++)
      53      for (off2 = 0; off2 < MAX_OFFSET; off2++)
      54        for (len = 0; len < MAX_TEST; len++)
      55  	{
      56  	  p1 = u1.buf;
      57  	  for (i = 0; i < off1; i++)
      58  	    *p1++ = '\0';
      59  
      60  	  buf1 = p1;
      61  	  for (i = 0; i < len; i++)
      62  	    *p1++ = 'a';
      63  
      64  	  mod1 = p1;
      65  	  for (i = 0; i < MAX_EXTRA; i++)
      66  	    *p1++ = 'x';
      67  
      68  	  p2 = u2.buf;
      69  	  for (i = 0; i < off2; i++)
      70  	    *p2++ = '\0';
      71  
      72  	  buf2 = p2;
      73  	  for (i = 0; i < len; i++)
      74  	    *p2++ = 'a';
      75  
      76  	  mod2 = p2;
      77  	  for (i = 0; i < MAX_EXTRA; i++)
      78  	    *p2++ = 'x';
      79  
      80  	  mod1[0] = '\0';
      81  	  mod2[0] = '\0';
      82  	  test (buf1, buf2, MAX_LENGTH, 0);
      83  	  test (buf1, buf2, len, 0);
      84  
      85  	  mod1[0] = 'a';
      86  	  mod1[1] = '\0';
      87  	  mod2[0] = '\0';
      88  	  test (buf1, buf2, MAX_LENGTH, +1);
      89  	  test (buf1, buf2, len, 0);
      90  
      91  	  mod1[0] = '\0';
      92  	  mod2[0] = 'a';
      93  	  mod2[1] = '\0';
      94  	  test (buf1, buf2, MAX_LENGTH, -1);
      95  	  test (buf1, buf2, len, 0);
      96  
      97  	  mod1[0] = 'b';
      98  	  mod1[1] = '\0';
      99  	  mod2[0] = 'c';
     100  	  mod2[1] = '\0';
     101  	  test (buf1, buf2, MAX_LENGTH, -1);
     102  	  test (buf1, buf2, len, 0);
     103  
     104  	  mod1[0] = 'c';
     105  	  mod1[1] = '\0';
     106  	  mod2[0] = 'b';
     107  	  mod2[1] = '\0';
     108  	  test (buf1, buf2, MAX_LENGTH, +1);
     109  	  test (buf1, buf2, len, 0);
     110  
     111  	  mod1[0] = 'b';
     112  	  mod1[1] = '\0';
     113  	  mod2[0] = (unsigned char)'\251';
     114  	  mod2[1] = '\0';
     115  	  test (buf1, buf2, MAX_LENGTH, -1);
     116  	  test (buf1, buf2, len, 0);
     117  
     118  	  mod1[0] = (unsigned char)'\251';
     119  	  mod1[1] = '\0';
     120  	  mod2[0] = 'b';
     121  	  mod2[1] = '\0';
     122  	  test (buf1, buf2, MAX_LENGTH, +1);
     123  	  test (buf1, buf2, len, 0);
     124  
     125  	  mod1[0] = (unsigned char)'\251';
     126  	  mod1[1] = '\0';
     127  	  mod2[0] = (unsigned char)'\252';
     128  	  mod2[1] = '\0';
     129  	  test (buf1, buf2, MAX_LENGTH, -1);
     130  	  test (buf1, buf2, len, 0);
     131  
     132  	  mod1[0] = (unsigned char)'\252';
     133  	  mod1[1] = '\0';
     134  	  mod2[0] = (unsigned char)'\251';
     135  	  mod2[1] = '\0';
     136  	  test (buf1, buf2, MAX_LENGTH, +1);
     137  	  test (buf1, buf2, len, 0);
     138  	}
     139  
     140    __builtin_exit (0);
     141  }