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 25static union { 26 unsigned char buf[MAX_LENGTH]; 27 long long align_int; 28 long double align_fp; 29} u1, u2; 30 31void 32test (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 abort (); 38 else if (expected == 0 && value != 0) 39 abort (); 40 else if (expected > 0 && value <= 0) 41 abort (); 42} 43 44main () 45{ 46 size_t off1, off2, len, i; 47 unsigned char *buf1, *buf2; 48 unsigned char *mod1, *mod2; 49 unsigned char *p1, *p2; 50 51 for (off1 = 0; off1 < MAX_OFFSET; off1++) 52 for (off2 = 0; off2 < MAX_OFFSET; off2++) 53 for (len = 0; len < MAX_TEST; len++) 54 { 55 p1 = u1.buf; 56 for (i = 0; i < off1; i++) 57 *p1++ = '\0'; 58 59 buf1 = p1; 60 for (i = 0; i < len; i++) 61 *p1++ = 'a'; 62 63 mod1 = p1; 64 for (i = 0; i < MAX_EXTRA; i++) 65 *p1++ = 'x'; 66 67 p2 = u2.buf; 68 for (i = 0; i < off2; i++) 69 *p2++ = '\0'; 70 71 buf2 = p2; 72 for (i = 0; i < len; i++) 73 *p2++ = 'a'; 74 75 mod2 = p2; 76 for (i = 0; i < MAX_EXTRA; i++) 77 *p2++ = 'x'; 78 79 mod1[0] = '\0'; 80 mod2[0] = '\0'; 81 test (buf1, buf2, MAX_LENGTH, 0); 82 test (buf1, buf2, len, 0); 83 84 mod1[0] = 'a'; 85 mod1[1] = '\0'; 86 mod2[0] = '\0'; 87 test (buf1, buf2, MAX_LENGTH, +1); 88 test (buf1, buf2, len, 0); 89 90 mod1[0] = '\0'; 91 mod2[0] = 'a'; 92 mod2[1] = '\0'; 93 test (buf1, buf2, MAX_LENGTH, -1); 94 test (buf1, buf2, len, 0); 95 96 mod1[0] = 'b'; 97 mod1[1] = '\0'; 98 mod2[0] = 'c'; 99 mod2[1] = '\0'; 100 test (buf1, buf2, MAX_LENGTH, -1); 101 test (buf1, buf2, len, 0); 102 103 mod1[0] = 'c'; 104 mod1[1] = '\0'; 105 mod2[0] = 'b'; 106 mod2[1] = '\0'; 107 test (buf1, buf2, MAX_LENGTH, +1); 108 test (buf1, buf2, len, 0); 109 110 mod1[0] = 'b'; 111 mod1[1] = '\0'; 112 mod2[0] = (unsigned char)'\251'; 113 mod2[1] = '\0'; 114 test (buf1, buf2, MAX_LENGTH, -1); 115 test (buf1, buf2, len, 0); 116 117 mod1[0] = (unsigned char)'\251'; 118 mod1[1] = '\0'; 119 mod2[0] = 'b'; 120 mod2[1] = '\0'; 121 test (buf1, buf2, MAX_LENGTH, +1); 122 test (buf1, buf2, len, 0); 123 124 mod1[0] = (unsigned char)'\251'; 125 mod1[1] = '\0'; 126 mod2[0] = (unsigned char)'\252'; 127 mod2[1] = '\0'; 128 test (buf1, buf2, MAX_LENGTH, -1); 129 test (buf1, buf2, len, 0); 130 131 mod1[0] = (unsigned char)'\252'; 132 mod1[1] = '\0'; 133 mod2[0] = (unsigned char)'\251'; 134 mod2[1] = '\0'; 135 test (buf1, buf2, MAX_LENGTH, +1); 136 test (buf1, buf2, len, 0); 137 } 138 139 exit (0); 140} 141