1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Tester for string functions.
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Copyright (C) 1995-2000, 2001, 2003 Free Software Foundation, Inc.
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of the GNU C Library.
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU C Library is free software; you can redistribute it and/or
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU Lesser General Public
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License as published by the Free Software Foundation; either
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   version 2.1 of the License, or (at your option) any later version.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU C Library is distributed in the hope that it will be useful,
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   but WITHOUT ANY WARRANTY; without even the implied warranty of
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Lesser General Public License for more details.
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU Lesser General Public
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License along with the GNU C Library; if not, write to the Free
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02111-1307 USA.  */
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef _GNU_SOURCE
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _GNU_SOURCE
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Make sure we don't test the optimized inline functions if we want to
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test the real implementation.  */
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined DO_STRING_INLINES
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef __USE_STRING_INLINES
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <errno.h>
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h>
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <strings.h>
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <fcntl.h>
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef HAVE_GNU_LD
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _sys_nerr	sys_nerr
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _sys_errlist	sys_errlist
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define	STREQ(a, b)	(strcmp((a), (b)) == 0)
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst char *it = "<UNSET>";	/* Routine name for message routines. */
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsize_t errors = 0;
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Complain if condition is not true.  */
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncheck (int thing, int number)
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (!thing)
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%s flunked test %d\n", it, number);
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ++errors;
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Complain if first two args don't strcmp as equal.  */
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownequal (const char *a, const char *b, int number)
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(a != NULL && b != NULL && STREQ (a, b), number);
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownchar one[50];
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownchar two[50];
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownchar *cp;
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strcmp (void)
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strcmp";
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcmp ("", "") == 0, 1);		/* Trivial case. */
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcmp ("a", "a") == 0, 2);		/* Identity. */
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcmp ("abc", "abc") == 0, 3);	/* Multicharacter. */
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcmp ("abc", "abcd") < 0, 4);	/* Length mismatches. */
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcmp ("abcd", "abc") > 0, 5);
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcmp ("abcd", "abce") < 0, 6);	/* Honest miscompares. */
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcmp ("abce", "abcd") > 0, 7);
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcmp ("a\203", "a") > 0, 8);		/* Tricky if char signed. */
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcmp ("a\203", "a\003") > 0, 9);
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char buf1[0x40], buf2[0x40];
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int i, j;
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (i=0; i < 0x10; i++)
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j = 0; j < 0x10; j++)
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	{
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  int k;
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  for (k = 0; k < 0x3f; k++)
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    {
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      buf1[k] = '0' ^ (k & 4);
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      buf2[k] = '4' ^ (k & 4);
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    }
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  buf1[i] = buf1[0x3f] = 0;
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  buf2[j] = buf2[0x3f] = 0;
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  for (k = 0; k < 0xf; k++)
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    {
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      int cnum = 0x10+0x10*k+0x100*j+0x1000*i;
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      check (strcmp (buf1+i,buf2+j) == 0, cnum);
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      buf1[i+k] = 'A' + i + k;
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      buf1[i+k+1] = 0;
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      check (strcmp (buf1+i,buf2+j) > 0, cnum+1);
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      check (strcmp (buf2+j,buf1+i) < 0, cnum+2);
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      buf2[j+k] = 'B' + i + k;
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      buf2[j+k+1] = 0;
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      check (strcmp (buf1+i,buf2+j) < 0, cnum+3);
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      check (strcmp (buf2+j,buf1+i) > 0, cnum+4);
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      buf2[j+k] = 'A' + i + k;
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      buf1[i] = 'A' + i + 0x80;
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      check (strcmp (buf1+i,buf2+j) > 0, cnum+5);
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      check (strcmp (buf2+j,buf1+i) < 0, cnum+6);
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      buf1[i] = 'A' + i;
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    }
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	}
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SIMPLE_COPY(fn, n, str, ntest) \
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do {									      \
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int __n;								      \
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char *cp;								      \
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (__n = 0; __n < (int) sizeof (one); ++__n)			      \
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      one[__n] = 'Z';							      \
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    fn (one, str);							      \
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (cp = one, __n = 0; __n < n; ++__n, ++cp)			      \
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check (*cp == '0' + (n % 10), ntest);				      \
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    check (*cp == '\0', ntest);						      \
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  } while (0)
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strcpy (void)
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i;
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strcpy";
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcpy (one, "abcd") == one, 1); /* Returned value. */
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcd", 2);		/* Basic test. */
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "x");
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "x", 3);			/* Writeover. */
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+2, "cd", 4);		/* Wrote too much? */
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (two, "hi there");
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, two);
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "hi there", 5);		/* Basic test encore. */
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (two, "hi there", 6);		/* Stomped on source? */
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "", 7);			/* Boundary condition. */
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 0; i < 16; i++)
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (void) strcpy (one + i, "hi there");	/* Unaligned destination. */
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      equal (one + i, "hi there", 8 + (i * 2));
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      (void) strcpy (two, one + i);		/* Unaligned source. */
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      equal (two, "hi there", 9 + (i * 2));
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 0, "", 41);
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 1, "1", 42);
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 2, "22", 43);
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 3, "333", 44);
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 4, "4444", 45);
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 5, "55555", 46);
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 6, "666666", 47);
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 7, "7777777", 48);
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 8, "88888888", 49);
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 9, "999999999", 50);
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 10, "0000000000", 51);
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 11, "11111111111", 52);
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 12, "222222222222", 53);
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 13, "3333333333333", 54);
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 14, "44444444444444", 55);
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 15, "555555555555555", 56);
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(strcpy, 16, "6666666666666666", 57);
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Simple test using implicitly coerced `void *' arguments.  */
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  { const void *src = "frobozz";
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    void *dst = one;
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    check (strcpy (dst, src) == dst, 1);
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    equal (dst, "frobozz", 2);
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_stpcpy (void)
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "stpcpy";
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "a") - one) == 1, 1);
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "a", 2);
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "ab") - one) == 2, 3);
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "ab", 4);
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "abc") - one) == 3, 5);
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abc", 6);
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "abcd") - one) == 4, 7);
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcd", 8);
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "abcde") - one) == 5, 9);
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcde", 10);
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "abcdef") - one) == 6, 11);
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcdef", 12);
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "abcdefg") - one) == 7, 13);
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcdefg", 14);
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "abcdefgh") - one) == 8, 15);
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcdefgh", 16);
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "abcdefghi") - one) == 9, 17);
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcdefghi", 18);
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "x") - one) == 1, 19);
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "x", 20);			/* Writeover. */
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+2, "cdefghi", 21);		/* Wrote too much? */
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "xx") - one) == 2, 22);
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xx", 23);		/* Writeover. */
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+3, "defghi", 24);		/* Wrote too much? */
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "xxx") - one) == 3, 25);
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xxx", 26);		/* Writeover. */
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+4, "efghi", 27);		/* Wrote too much? */
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "xxxx") - one) == 4, 28);
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xxxx", 29);		/* Writeover. */
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+5, "fghi", 30);		/* Wrote too much? */
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "xxxxx") - one) == 5, 31);
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xxxxx", 32);		/* Writeover. */
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+6, "ghi", 33);		/* Wrote too much? */
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "xxxxxx") - one) == 6, 34);
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xxxxxx", 35);		/* Writeover. */
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+7, "hi", 36);		/* Wrote too much? */
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (one, "xxxxxxx") - one) == 7, 37);
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xxxxxxx", 38);		/* Writeover. */
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+8, "i", 39);		/* Wrote too much? */
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check ((stpcpy (stpcpy (stpcpy (one, "a"), "b"), "c") - one) == 3, 40);
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abc", 41);
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one + 4, "xxx", 42);
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 0, "", 43);
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 1, "1", 44);
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 2, "22", 45);
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 3, "333", 46);
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 4, "4444", 47);
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 5, "55555", 48);
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 6, "666666", 49);
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 7, "7777777", 50);
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 8, "88888888", 51);
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 9, "999999999", 52);
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 10, "0000000000", 53);
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 11, "11111111111", 54);
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 12, "222222222222", 55);
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 13, "3333333333333", 56);
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 14, "44444444444444", 57);
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 15, "555555555555555", 58);
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  SIMPLE_COPY(stpcpy, 16, "6666666666666666", 59);
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// DDD: better done by testing for the function.
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined(__APPLE__)
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_stpncpy (void)
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "stpncpy";
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  memset (one, 'x', sizeof (one));
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (stpncpy (one, "abc", 2) == one + 2, 1);
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (stpncpy (one, "abc", 3) == one + 3, 2);
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (stpncpy (one, "abc", 4) == one + 3, 3);
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (one[3] == '\0' && one[4] == 'x', 4);
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (stpncpy (one, "abcd", 5) == one + 4, 5);
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (one[4] == '\0' && one[5] == 'x', 6);
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (stpncpy (one, "abcd", 6) == one + 4, 7);
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (one[4] == '\0' && one[5] == '\0' && one[6] == 'x', 8);
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strcat (void)
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strcat";
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ijk");
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strcat (one, "lmn") == one, 1); /* Returned value. */
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "ijklmn", 2);		/* Basic test. */
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "x");
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcat (one, "yz");
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xyz", 3);			/* Writeover. */
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+4, "mn", 4);			/* Wrote too much? */
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "gh");
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (two, "ef");
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcat (one, two);
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "ghef", 5);			/* Basic test encore. */
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (two, "ef", 6);			/* Stomped on source? */
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcat (one, "");
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "", 7);			/* Boundary conditions. */
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ab");
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcat (one, "");
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "ab", 8);
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcat (one, "cd");
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "cd", 9);
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strncat (void)
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* First test it as strcat, with big counts, then test the count
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     mechanism.  */
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strncat";
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ijk");
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncat (one, "lmn", 99) == one, 1);	/* Returned value. */
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "ijklmn", 2);		/* Basic test. */
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "x");
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncat (one, "yz", 99);
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xyz", 3);		/* Writeover. */
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+4, "mn", 4);		/* Wrote too much? */
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "gh");
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (two, "ef");
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncat (one, two, 99);
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "ghef", 5);			/* Basic test encore. */
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (two, "ef", 6);			/* Stomped on source? */
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncat (one, "", 99);
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "", 7);			/* Boundary conditions. */
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ab");
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncat (one, "", 99);
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "ab", 8);
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncat (one, "cd", 99);
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "cd", 9);
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ab");
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncat (one, "cdef", 2);
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcd", 10);			/* Count-limited. */
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncat (one, "gh", 0);
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcd", 11);			/* Zero count. */
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncat (one, "gh", 2);
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abcdgh", 12);		/* Count and length equal. */
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strncmp (void)
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* First test as strcmp with big counts, then test count code.  */
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strncmp";
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("", "", 99) == 0, 1);	/* Trivial case. */
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("a", "a", 99) == 0, 2);	/* Identity. */
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("abc", "abc", 99) == 0, 3);	/* Multicharacter. */
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("abc", "abcd", 99) < 0, 4);	/* Length unequal. */
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("abcd", "abc", 99) > 0, 5);
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("abcd", "abce", 99) < 0, 6);	/* Honestly unequal. */
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("abce", "abcd", 99) > 0, 7);
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("a\203", "a", 2) > 0, 8);	/* Tricky if '\203' < 0 */
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("a\203", "a\003", 2) > 0, 9);
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("abce", "abcd", 3) == 0, 10);	/* Count limited. */
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("abce", "abc", 3) == 0, 11);	/* Count == length. */
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("abcd", "abce", 4) < 0, 12);	/* Nudging limit. */
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncmp ("abc", "def", 0) == 0, 13);	/* Zero count. */
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strncpy (void)
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Testing is a bit different because of odd semantics.  */
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strncpy";
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strncpy (one, "abc", 4) == one, 1);	/* Returned value. */
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abc", 2);			/* Did the copy go right? */
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcdefgh");
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncpy (one, "xyz", 2);
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xycdefgh", 3);			/* Copy cut by count. */
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcdefgh");
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncpy (one, "xyz", 3);		/* Copy cut just before NUL. */
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xyzdefgh", 4);
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcdefgh");
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncpy (one, "xyz", 4);		/* Copy just includes NUL. */
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xyz", 5);
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+4, "efgh", 6);			/* Wrote too much? */
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcdefgh");
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncpy (one, "xyz", 5);		/* Copy includes padding. */
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "xyz", 7);
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+4, "", 8);
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+5, "fgh", 9);
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abc");
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncpy (one, "xyz", 0);		/* Zero-length copy. */
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "abc", 10);
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncpy (one, "", 2);		/* Zero-length source. */
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "", 11);
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+1, "", 12);
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one+2, "c", 13);
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "hi there");
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strncpy (two, one, 9);
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (two, "hi there", 14);		/* Just paranoia. */
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal (one, "hi there", 15);		/* Stomped on source? */
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strlen (void)
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strlen";
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strlen ("") == 0, 1);		/* Empty. */
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strlen ("a") == 1, 2);		/* Single char. */
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strlen ("abcd") == 4, 3);	/* Multiple chars. */
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char buf[4096];
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int i;
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char *p;
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (i=0; i < 0x100; i++)
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	p = (char *) ((unsigned long int)(buf + 0xff) & ~0xff) + i;
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p, "OK");
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p+3, "BAD/WRONG");
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	check (strlen (p) == 2, 4+i);
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strchr (void)
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strchr";
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchr ("abcd", 'z') == NULL, 1);	/* Not found. */
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcd");
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchr (one, 'c') == one+2, 2);	/* Basic test. */
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchr (one, 'd') == one+3, 3);	/* End of string. */
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchr (one, 'a') == one, 4);		/* Beginning. */
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchr (one, '\0') == one+4, 5);	/* Finding NUL. */
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ababa");
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchr (one, 'b') == one+1, 6);	/* Finding first. */
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchr (one, 'b') == NULL, 7);		/* Empty string. */
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchr (one, '\0') == one, 8);		/* NUL in empty string. */
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char buf[4096];
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int i;
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char *p;
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (i=0; i < 0x100; i++)
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i;
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p, "OK");
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p+3, "BAD/WRONG");
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	check (strchr (p, '/') == NULL, 9+i);
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// DDD: better done by testing for the function.
470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if !defined(__APPLE__)
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strchrnul (void)
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  const char *os;
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strchrnul";
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strchrnul ((os = "abcd"), 'z');
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (*cp == '\0', 1);			/* Not found. */
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (cp == os + 4, 2);
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcd");
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchrnul (one, 'c') == one+2, 3);	/* Basic test. */
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchrnul (one, 'd') == one+3, 4);	/* End of string. */
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchrnul (one, 'a') == one, 5);	/* Beginning. */
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchrnul (one, '\0') == one+4, 6);	/* Finding NUL. */
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ababa");
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchrnul (one, 'b') == one+1, 7);	/* Finding first. */
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchrnul (one, 'b') == one, 8);	/* Empty string. */
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strchrnul (one, '\0') == one, 9);	/* NUL in empty string. */
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char buf[4096];
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int i;
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char *p;
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (i=0; i < 0x100; i++)
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i;
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p, "OK");
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p+3, "BAD/WRONG");
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cp = strchrnul (p, '/');
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	check (*cp == '\0', 9+2*i);
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	check (cp == p+2, 10+2*i);
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// DDD: better done by testing for the function.
507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if !defined(__APPLE__)
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_rawmemchr (void)
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "rawmemchr";
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcd");
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rawmemchr (one, 'c') == one+2, 1);	/* Basic test. */
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rawmemchr (one, 'd') == one+3, 2);	/* End of string. */
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rawmemchr (one, 'a') == one, 3);		/* Beginning. */
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rawmemchr (one, '\0') == one+4, 4);	/* Finding NUL. */
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ababa");
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rawmemchr (one, 'b') == one+1, 5);	/* Finding first. */
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rawmemchr (one, '\0') == one, 6);	/* NUL in empty string. */
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char buf[4096];
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int i;
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char *p;
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (i=0; i < 0x100; i++)
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i;
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p, "OK");
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p+3, "BAD/WRONG");
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	check (rawmemchr (p, 'R') == p+8, 6+i);
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_index (void)
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "index";
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (index ("abcd", 'z') == NULL, 1);	/* Not found. */
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcd");
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (index (one, 'c') == one+2, 2);	/* Basic test. */
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (index (one, 'd') == one+3, 3);	/* End of string. */
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (index (one, 'a') == one, 4);	/* Beginning. */
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (index (one, '\0') == one+4, 5);	/* Finding NUL. */
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ababa");
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (index (one, 'b') == one+1, 6);	/* Finding first. */
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (index (one, 'b') == NULL, 7);	/* Empty string. */
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (index (one, '\0') == one, 8);	/* NUL in empty string. */
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strrchr (void)
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strrchr";
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strrchr ("abcd", 'z') == NULL, 1);	/* Not found. */
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcd");
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strrchr (one, 'c') == one+2, 2);	/* Basic test. */
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strrchr (one, 'd') == one+3, 3);	/* End of string. */
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strrchr (one, 'a') == one, 4);		/* Beginning. */
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strrchr (one, '\0') == one+4, 5);	/* Finding NUL. */
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ababa");
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strrchr (one, 'b') == one+3, 6);	/* Finding last. */
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strrchr (one, 'b') == NULL, 7);	/* Empty string. */
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (strrchr (one, '\0') == one, 8);	/* NUL in empty string. */
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char buf[4096];
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int i;
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char *p;
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (i=0; i < 0x100; i++)
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      {
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i;
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p, "OK");
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	strcpy (p+3, "BAD/WRONG");
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	check (strrchr (p, '/') == NULL, 9+i);
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// DDD: better done by testing for the function.
583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if !defined(__APPLE__)
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_memrchr (void)
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  size_t l;
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "memrchr";
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (memrchr ("abcd", 'z', 5) == NULL, 1);	/* Not found. */
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcd");
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  l = strlen (one) + 1;
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (memrchr (one, 'c', l) == one+2, 2);	/* Basic test. */
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (memrchr (one, 'd', l) == one+3, 3);	/* End of string. */
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (memrchr (one, 'a', l) == one, 4);		/* Beginning. */
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (memrchr (one, '\0', l) == one+4, 5);	/* Finding NUL. */
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ababa");
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  l = strlen (one) + 1;
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (memrchr (one, 'b', l) == one+3, 6);	/* Finding last. */
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  l = strlen (one) + 1;
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (memrchr (one, 'b', l) == NULL, 7);	/* Empty string. */
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (memrchr (one, '\0', l) == one, 8);	/* NUL in empty string. */
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* now test all possible alignment and length combinations to catch
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     bugs due to unrolled loops (assuming unrolling is limited to no
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     more than 128 byte chunks: */
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char buf[128 + sizeof(long)];
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    long align, len, i, pos;
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (align = 0; align < (long) sizeof(long); ++align) {
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (len = 0; len < (long) (sizeof(buf) - align); ++len) {
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	for (i = 0; i < len; ++i)
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  buf[align + i] = 'x';		/* don't depend on memset... */
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	for (pos = len - 1; pos >= 0; --pos) {
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  printf("align %d, len %d, pos %d\n", align, len, pos);
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  check(memrchr(buf + align, 'x', len) == buf + align + pos, 9);
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  check(memrchr(buf + align + pos + 1, 'x', len - (pos + 1)) == NULL,
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		10);
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  buf[align + pos] = '-';
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	}
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_rindex (void)
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "rindex";
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rindex ("abcd", 'z') == NULL, 1);	/* Not found. */
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "abcd");
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rindex (one, 'c') == one+2, 2);	/* Basic test. */
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rindex (one, 'd') == one+3, 3);	/* End of string. */
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rindex (one, 'a') == one, 4);	/* Beginning. */
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rindex (one, '\0') == one+4, 5);	/* Finding NUL. */
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "ababa");
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rindex (one, 'b') == one+3, 6);	/* Finding last. */
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy (one, "");
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rindex (one, 'b') == NULL, 7);	/* Empty string. */
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check (rindex (one, '\0') == one, 8);	/* NUL in empty string. */
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strpbrk (void)
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strpbrk";
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk("abcd", "z") == NULL, 1);	/* Not found. */
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcd");
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "c") == one+2, 2);	/* Basic test. */
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "d") == one+3, 3);	/* End of string. */
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "a") == one, 4);	/* Beginning. */
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "") == NULL, 5);	/* Empty search list. */
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "cb") == one+1, 6);	/* Multiple search. */
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcabdea");
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "b") == one+1, 7);	/* Finding first. */
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "cb") == one+1, 8);	/* With multiple search. */
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "db") == one+1, 9);	/* Another variant. */
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "");
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "bc") == NULL, 10);	/* Empty string. */
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "");
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "bcd") == NULL, 11);	/* Empty string. */
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "");
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "bcde") == NULL, 12);	/* Empty string. */
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "") == NULL, 13);	/* Both strings empty. */
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcabdea");
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "befg") == one+1, 14);	/* Finding first. */
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "cbr") == one+1, 15);	/* With multiple search. */
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "db") == one+1, 16);	/* Another variant. */
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strpbrk(one, "efgh") == one+6, 17);	/* And yet another. */
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strstr (void)
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strstr";
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr("abcd", "z") == NULL, 1);	/* Not found. */
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr("abcd", "abx") == NULL, 2);	/* Dead end. */
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcd");
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "c") == one+2, 3);	/* Basic test. */
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "bc") == one+1, 4);	/* Multichar. */
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "d") == one+3, 5);	/* End of string. */
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "cd") == one+2, 6);	/* Tail of string. */
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "abc") == one, 7);	/* Beginning. */
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "abcd") == one, 8);	/* Exact match. */
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "abcde") == NULL, 9);	/* Too long. */
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "de") == NULL, 10);	/* Past end. */
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "") == one, 11);	/* Finding empty. */
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "ababa");
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "ba") == one+1, 12);	/* Finding first. */
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "");
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "b") == NULL, 13);	/* Empty string. */
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "") == one, 14);	/* Empty in empty string. */
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "bcbca");
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "bca") == one+2, 15);	/* False start. */
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "bbbcabbca");
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strstr(one, "bbca") == one+1, 16);	/* With overlap. */
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strspn (void)
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strspn";
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strspn("abcba", "abc") == 5, 1);	/* Whole string. */
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strspn("abcba", "ab") == 2, 2);	/* Partial. */
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strspn("abc", "qx") == 0, 3);	/* None. */
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strspn("", "ab") == 0, 4);	/* Null string. */
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strspn("abc", "") == 0, 5);	/* Null search list. */
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strcspn (void)
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strcspn";
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcspn("abcba", "qx") == 5, 1);	/* Whole string. */
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcspn("abcba", "cx") == 2, 2);	/* Partial. */
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcspn("abc", "abc") == 0, 3);	/* None. */
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcspn("", "ab") == 0, 4);	/* Null string. */
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcspn("abc", "") == 3, 5);	/* Null search list. */
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strtok (void)
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strtok";
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "first, second, third");
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok(one, ", "), "first", 1);	/* Basic test. */
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "first", 2);
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, ", "), "second", 3);
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, ", "), "third", 4);
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok((char *)NULL, ", ") == NULL, 5);
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, ", first, ");
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok(one, ", "), "first", 6);	/* Extra delims, 1 tok. */
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok((char *)NULL, ", ") == NULL, 7);
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "1a, 1b; 2a, 2b");
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok(one, ", "), "1a", 8);	/* Changing delim lists. */
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, "; "), "1b", 9);
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, ", "), "2a", 10);
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(two, "x-y");
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok(two, "-"), "x", 11);	/* New string before done. */
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, "-"), "y", 12);
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok((char *)NULL, "-") == NULL, 13);
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "a,b, c,, ,d");
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok(one, ", "), "a", 14);	/* Different separators. */
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, ", "), "b", 15);
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, " ,"), "c", 16);	/* Permute list too. */
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, " ,"), "d", 17);
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok((char *)NULL, ", ") == NULL, 18);
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok((char *)NULL, ", ") == NULL, 19);	/* Persistence. */
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, ", ");
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok(one, ", ") == NULL, 20);	/* No tokens. */
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "");
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok(one, ", ") == NULL, 21);	/* Empty string. */
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abc");
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok(one, ", "), "abc", 22);	/* No delimiters. */
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok((char *)NULL, ", ") == NULL, 23);
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abc");
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok(one, ""), "abc", 24);	/* Empty delimiter list. */
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok((char *)NULL, "") == NULL, 25);
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "a,b,c");
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok(one, ","), "a", 26);	/* Basics again... */
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, ","), "b", 27);
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok((char *)NULL, ","), "c", 28);
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok((char *)NULL, ",") == NULL, 29);
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+6, "gh", 30);			/* Stomped past end? */
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "a", 31);			/* Stomped old tokens? */
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+2, "b", 32);
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+4, "c", 33);
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strtok_r (void)
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strtok_r";
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "first, second, third");
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;	/* Always initialize cp to make sure it doesn't point to some old data.  */
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r(one, ", ", &cp), "first", 1);	/* Basic test. */
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "first", 2);
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, ", ", &cp), "second", 3);
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, ", ", &cp), "third", 4);
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r((char *)NULL, ", ", &cp) == NULL, 5);
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, ", first, ");
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r(one, ", ", &cp), "first", 6);	/* Extra delims, 1 tok. */
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r((char *)NULL, ", ", &cp) == NULL, 7);
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "1a, 1b; 2a, 2b");
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r(one, ", ", &cp), "1a", 8);	/* Changing delim lists. */
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, "; ", &cp), "1b", 9);
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, ", ", &cp), "2a", 10);
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(two, "x-y");
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r(two, "-", &cp), "x", 11);	/* New string before done. */
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, "-", &cp), "y", 12);
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r((char *)NULL, "-", &cp) == NULL, 13);
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "a,b, c,, ,d");
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r(one, ", ", &cp), "a", 14);	/* Different separators. */
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, ", ", &cp), "b", 15);
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, " ,", &cp), "c", 16);	/* Permute list too. */
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, " ,", &cp), "d", 17);
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r((char *)NULL, ", ", &cp) == NULL, 18);
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r((char *)NULL, ", ", &cp) == NULL, 19);	/* Persistence. */
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, ", ");
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r(one, ", ", &cp) == NULL, 20);	/* No tokens. */
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "");
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r(one, ", ", &cp) == NULL, 21);	/* Empty string. */
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r((char *)NULL, ", ", &cp) == NULL, 22);	/* Persistence. */
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abc");
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r(one, ", ", &cp), "abc", 23);	/* No delimiters. */
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r((char *)NULL, ", ", &cp) == NULL, 24);
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abc");
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r(one, "", &cp), "abc", 25);	/* Empty delimiter list. */
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r((char *)NULL, "", &cp) == NULL, 26);
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "a,b,c");
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = NULL;
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r(one, ",", &cp), "a", 27);	/* Basics again... */
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, ",", &cp), "b", 28);
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strtok_r((char *)NULL, ",", &cp), "c", 29);
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strtok_r((char *)NULL, ",", &cp) == NULL, 30);
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+6, "gh", 31);			/* Stomped past end? */
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "a", 32);			/* Stomped old tokens? */
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+2, "b", 33);
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+4, "c", 34);
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strsep (void)
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  char *ptr;
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strsep";
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "first, second, third");
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "first", 1);	/* Basic test. */
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "first", 2);
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 3);
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "second", 4);
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 5);
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "third", 6);
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ", ") == NULL, 7);
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, ", first, ");
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 8);
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 9);
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "first", 10);	/* Extra delims, 1 tok. */
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 11);
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 12);
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ", ") == NULL, 13);
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "1a, 1b; 2a, 2b");
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "1a", 14);	/* Changing delim lists. */
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 15);
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "; "), "1b", 16);
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 17);
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "2a", 18);
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(two, "x-y");
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "-"), "x", 19);	/* New string before done. */
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "-"), "y", 20);
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, "-") == NULL, 21);
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "a,b, c,, ,d ");
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "a", 22);	/* Different separators. */
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "b", 23);
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, " ,"), "", 24);
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, " ,"), "c", 25);	/* Permute list too. */
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, " ,"), "", 26);
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, " ,"), "", 27);
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, " ,"), "", 28);
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, " ,"), "d", 29);
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, " ,"), "", 30);
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ", ") == NULL, 31);
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ", ") == NULL, 32);	/* Persistence. */
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, ", ");
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 33);
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 34);
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 35);
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ", ") == NULL, 36);	/* No tokens. */
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "");
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "", 37);
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ", ") == NULL, 38);	/* Empty string. */
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "abc");
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ", "), "abc", 39);	/* No delimiters. */
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ", ") == NULL, 40);
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "abc");
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ""), "abc", 41);	/* Empty delimiter list. */
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, "") == NULL, 42);
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "a,b,c");
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), "a", 43);	/* Basics again... */
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), "b", 44);
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), "c", 45);
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ",") == NULL, 46);
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+6, "gh", 47);		/* Stomped past end? */
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "a", 48);			/* Stomped old tokens? */
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+2, "b", 49);
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+4, "c", 50);
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#   if !defined(__APPLE__)
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char text[] = "This,is,a,test";
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char *list = strdupa (text);
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    equal (strsep (&list, ","), "This", 51);
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    equal (strsep (&list, ","), "is", 52);
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    equal (strsep (&list, ","), "a", 53);
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    equal (strsep (&list, ","), "test", 54);
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    check (strsep (&list, ",") == NULL, 55);
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#   endif
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "a,b, c,, ,d,");
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), "a", 56);	/* Different separators. */
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), "b", 57);
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), " c", 58);	/* Permute list too. */
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), "", 59);
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), " ", 60);
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), "d", 61);
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), "", 62);
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ",") == NULL, 63);
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ",") == NULL, 64);	/* Persistence. */
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "a,b, c,, ,d,");
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "xy,"), "a", 65);	/* Different separators. */
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "x,y"), "b", 66);
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ",xy"), " c", 67);	/* Permute list too. */
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "xy,"), "", 68);
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "x,y"), " ", 69);
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ",xy"), "d", 70);
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "xy,"), "", 71);
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, "x,y") == NULL, 72);
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strsep(&cp, ",xy") == NULL, 73);	/* Persistence. */
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "ABC");
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  one[4] = ':';
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "C"), "AB", 74);	/* Access beyond NUL.  */
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ptr = strsep(&cp, ":");
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(ptr, "", 75);
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(ptr == one + 3, 76);
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(cp == NULL, 77);
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "ABC");
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  one[4] = ':';
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, "CD"), "AB", 78);	/* Access beyond NUL.  */
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ptr = strsep(&cp, ":.");
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(ptr, "", 79);
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(ptr == one + 3, 80);
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = strcpy(one, "ABC");		/* No token in string.  */
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(strsep(&cp, ","), "ABC", 81);
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(cp == NULL, 82);
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  *one = '\0';				/* Empty string. */
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = one;
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ptr = strsep(&cp, ",");
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(ptr, "", 83);
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(ptr == one, 84);
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(cp == NULL, 85);
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  *one = '\0';				/* Empty string and no token. */
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  cp = one;
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ptr = strsep(&cp, "");
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(ptr, "", 86);
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(ptr == one , 87);
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(cp == NULL, 88);
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_memcmp (void)
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "memcmp";
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memcmp("a", "a", 1) == 0, 1);		/* Identity. */
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memcmp("abc", "abc", 3) == 0, 2);	/* Multicharacter. */
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memcmp("abcd", "abce", 4) < 0, 3);	/* Honestly unequal. */
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memcmp("abce", "abcd", 4) > 0, 4);
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memcmp("alph", "beta", 4) < 0, 5);
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memcmp("a\203", "a\003", 2) > 0, 6);
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memcmp("abce", "abcd", 3) == 0, 7);	/* Count limited. */
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memcmp("abc", "def", 0) == 0, 8);	/* Zero count. */
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_memchr (void)
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "memchr";
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr("abcd", 'z', 4) == NULL, 1);	/* Not found. */
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcd");
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr(one, 'c', 4) == one+2, 2);	/* Basic test. */
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr(one, ~0xff|'c', 4) == one+2, 2);	/* ignore highorder bits. */
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr(one, 'd', 4) == one+3, 3);	/* End of string. */
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr(one, 'a', 4) == one, 4);	/* Beginning. */
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr(one, '\0', 5) == one+4, 5);	/* Finding NUL. */
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "ababa");
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr(one, 'b', 5) == one+1, 6);	/* Finding first. */
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr(one, 'b', 0) == NULL, 7);	/* Zero count. */
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr(one, 'a', 1) == one, 8);	/* Singleton case. */
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "a\203b");
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memchr(one, 0203, 3) == one+1, 9);	/* Unsignedness. */
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* now test all possible alignment and length combinations to catch
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     bugs due to unrolled loops (assuming unrolling is limited to no
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     more than 128 byte chunks: */
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char buf[128 + sizeof(long)];
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    long align, len, i, pos;
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (align = 0; align < (long) sizeof(long); ++align) {
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (len = 0; len < (long) (sizeof(buf) - align); ++len) {
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	for (i = 0; i < len; ++i) {
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  buf[align + i] = 'x';		/* don't depend on memset... */
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	}
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	for (pos = 0; pos < len; ++pos) {
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  printf("align %d, len %d, pos %d\n", align, len, pos);
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  check(memchr(buf + align, 'x', len) == buf + align + pos, 10);
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  check(memchr(buf + align, 'x', pos) == NULL, 11);
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  buf[align + pos] = '-';
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	}
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_memcpy (void)
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i;
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "memcpy";
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memcpy(one, "abc", 4) == one, 1);	/* Returned value. */
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 2);			/* Did the copy go right? */
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memcpy(one+1, "xyz", 2);
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "axydefgh", 3);		/* Basic test. */
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abc");
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memcpy(one, "xyz", 0);
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 4);			/* Zero-length copy. */
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "hi there");
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(two, "foo");
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memcpy(two, one, 9);
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(two, "hi there", 5);		/* Just paranoia. */
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "hi there", 6);		/* Stomped on source? */
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 0; i < 16; i++)
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      const char *x = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      strcpy (one, x);
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check (memcpy (one + i, "hi there", 9) == one + i,
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	     7 + (i * 6));		/* Unaligned destination. */
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check (memcmp (one, x, i) == 0, 8 + (i * 6));  /* Wrote under? */
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      equal (one + i, "hi there", 9 + (i * 6));
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check (one[i + 9] == 'x', 10 + (i * 6));       /* Wrote over? */
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check (memcpy (two, one + i, 9) == two,
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	     11 + (i * 6));		/* Unaligned source. */
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      equal (two, "hi there", 12 + (i * 6));
1063ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
1064ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1065ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if !defined(__APPLE__)
1067ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1068ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_mempcpy (void)
1069ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1070ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i;
1071ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "mempcpy";
1072ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(mempcpy(one, "abc", 4) == one + 4, 1);	/* Returned value. */
1073ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 2);			/* Did the copy go right? */
1074ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1075ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1076ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) mempcpy(one+1, "xyz", 2);
1077ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "axydefgh", 3);		/* Basic test. */
1078ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1079ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abc");
1080ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) mempcpy(one, "xyz", 0);
1081ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 4);			/* Zero-length copy. */
1082ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1083ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "hi there");
1084ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(two, "foo");
1085ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) mempcpy(two, one, 9);
1086ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(two, "hi there", 5);		/* Just paranoia. */
1087ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "hi there", 6);		/* Stomped on source? */
1088ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1089ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 0; i < 16; i++)
1090ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
1091ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      const char *x = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
1092ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      strcpy (one, x);
1093ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check (mempcpy (one + i, "hi there", 9) == one + i + 9,
1094ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	     7 + (i * 6));		/* Unaligned destination. */
1095ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check (memcmp (one, x, i) == 0, 8 + (i * 6));  /* Wrote under? */
1096ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      equal (one + i, "hi there", 9 + (i * 6));
1097ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check (one[i + 9] == 'x', 10 + (i * 6));       /* Wrote over? */
1098ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check (mempcpy (two, one + i, 9) == two + 9,
1099ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	     11 + (i * 6));		/* Unaligned source. */
1100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      equal (two, "hi there", 12 + (i * 6));
1101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
1102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
1104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_memmove (void)
1107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "memmove";
1109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memmove(one, "abc", 4) == one, 1);	/* Returned value. */
1110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 2);			/* Did the copy go right? */
1111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memmove(one+1, "xyz", 2);
1114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "axydefgh", 3);		/* Basic test. */
1115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abc");
1117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memmove(one, "xyz", 0);
1118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 4);			/* Zero-length copy. */
1119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "hi there");
1121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(two, "foo");
1122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memmove(two, one, 9);
1123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(two, "hi there", 5);		/* Just paranoia. */
1124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "hi there", 6);		/* Stomped on source? */
1125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memmove(one+1, one, 9);
1128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "aabcdefgh", 7);		/* Overlap, right-to-left. */
1129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memmove(one+1, one+2, 7);
1132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "acdefgh", 8);		/* Overlap, left-to-right. */
1133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memmove(one, one, 9);
1136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abcdefgh", 9);		/* 100% overlap. */
1137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_memccpy (void)
1141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* First test like memcpy, then the search part The SVID, the only
1143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     place where memccpy is mentioned, says overlap might fail, so we
1144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     don't try it.  Besides, it's hard to see the rationale for a
1145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     non-left-to-right memccpy.  */
1146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "memccpy";
1147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memccpy(one, "abc", 'q', 4) == NULL, 1);	/* Returned value. */
1148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 2);			/* Did the copy go right? */
1149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memccpy(one+1, "xyz", 'q', 2);
1152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "axydefgh", 3);		/* Basic test. */
1153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abc");
1155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memccpy(one, "xyz", 'q', 0);
1156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 4);			/* Zero-length copy. */
1157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "hi there");
1159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(two, "foo");
1160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memccpy(two, one, 'q', 9);
1161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(two, "hi there", 5);		/* Just paranoia. */
1162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "hi there", 6);		/* Stomped on source? */
1163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(two, "horsefeathers");
1166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memccpy(two, one, 'f', 9) == two+6, 7);	/* Returned value. */
1167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abcdefgh", 8);		/* Source intact? */
1168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(two, "abcdefeathers", 9);		/* Copy correct? */
1169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcd");
1171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(two, "bumblebee");
1172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memccpy(two, one, 'a', 4) == two+1, 10);	/* First char. */
1173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(two, "aumblebee", 11);
1174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memccpy(two, one, 'd', 4) == two+4, 12);	/* Last char. */
1175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(two, "abcdlebee", 13);
1176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "xyz");
1177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memccpy(two, one, 'x', 1) == two+1, 14);	/* Singleton. */
1178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(two, "xbcdlebee", 15);
1179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_memset (void)
1183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i;
1185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "memset";
1187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(memset(one+1, 'x', 3) == one+1, 1);	/* Return value. */
1189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "axxxefgh", 2);		/* Basic test. */
1190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memset(one+2, 'y', 0);
1192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "axxxefgh", 3);		/* Zero-length set. */
1193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memset(one+5, 0, 1);
1195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "axxxe", 4);			/* Zero fill. */
1196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+6, "gh", 5);			/* And the leftover. */
1197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) memset(one+2, 010045, 1);
1199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "ax\045xe", 6);		/* Unsigned char convert. */
1200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Non-8bit fill character.  */
1202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  memset (one, 0x101, sizeof (one));
1203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 0; i < (int) sizeof (one); ++i)
1204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    check (one[i] == '\01', 7);
1205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Test for more complex versions of memset, for all alignments and
1207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     lengths up to 256. This test takes a little while, perhaps it should
1208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     be made weaker?  */
1209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
1210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    char data[512];
1211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int j;
1212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int k;
1213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int c;
1214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (i = 0; i < 512; i++)
1216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      data[i] = 'x';
1217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (c = 0; c <= 'y'; c += 'y')  /* check for memset(,0,) and
1218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown					memset(,'y',) */
1219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (j = 0; j < 256; j++)
1220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	for (i = 0; i < 256; i++)
1221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  {
1222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    memset (data + i, c, j);
1223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    for (k = 0; k < i; k++)
1224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      if (data[k] != 'x')
1225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		goto fail;
1226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    for (k = i; k < i+j; k++)
1227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      {
1228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		if (data[k] != c)
1229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		  goto fail;
1230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		data[k] = 'x';
1231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      }
1232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    for (k = i+j; k < 512; k++)
1233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	      if (data[k] != 'x')
1234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown		goto fail;
1235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    continue;
1236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  fail:
1238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	    check (0, 8 + i + j * 256 + (c != 0) * 256 * 256);
1239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  }
1240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
1241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_bcopy (void)
1245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Much like memcpy.  Berklix manual is silent about overlap, so
1247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     don't test it.  */
1248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "bcopy";
1249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) bcopy("abc", one, 4);
1250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 1);			/* Simple copy. */
1251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdefgh");
1253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) bcopy("xyz", one+1, 2);
1254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "axydefgh", 2);		/* Basic test. */
1255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abc");
1257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) bcopy("xyz", one, 0);
1258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abc", 3);			/* Zero-length copy. */
1259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "hi there");
1261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(two, "foo");
1262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) bcopy(one, two, 9);
1263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(two, "hi there", 4);		/* Just paranoia. */
1264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "hi there", 5);		/* Stomped on source? */
1265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_bzero (void)
1269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "bzero";
1271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdef");
1272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  bzero(one+2, 2);
1273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "ab", 1);			/* Basic test. */
1274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+3, "", 2);
1275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one+4, "ef", 3);
1276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  (void) strcpy(one, "abcdef");
1278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  bzero(one+2, 0);
1279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  equal(one, "abcdef", 4);		/* Zero-length copy. */
1280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined(__APPLE__)
1283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strndup (void)
1285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  char *p, *q;
1287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strndup";
1288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  p = strndup("abcdef", 12);
1289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(p != NULL, 1);
1290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (p != NULL)
1291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
1292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      equal(p, "abcdef", 2);
1293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      q = strndup(p + 1, 2);
1294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      check(q != NULL, 3);
1295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (q != NULL)
1296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	equal(q, "bc", 4);
1297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      free (q);
1298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
1299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  free (p);
1300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  p = strndup("abc def", 3);
1301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(p != NULL, 5);
1302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (p != NULL)
1303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    equal(p, "abc", 6);
1304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  free (p);
1305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_bcmp (void)
1310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "bcmp";
1312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(bcmp("a", "a", 1) == 0, 1);	/* Identity. */
1313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(bcmp("abc", "abc", 3) == 0, 2);	/* Multicharacter. */
1314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(bcmp("abcd", "abce", 4) != 0, 3);	/* Honestly unequal. */
1315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(bcmp("abce", "abcd", 4) != 0, 4);
1316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(bcmp("alph", "beta", 4) != 0, 5);
1317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(bcmp("abce", "abcd", 3) == 0, 6);	/* Count limited. */
1318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(bcmp("abc", "def", 0) == 0, 8);	/* Zero count. */
1319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strerror (void)
1323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strerror";
1325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strerror(EDOM) != 0, 1);
1326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strerror(ERANGE) != 0, 2);
1327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strerror(ENOENT) != 0, 3);
1328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strcasecmp (void)
1332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strcasecmp";
1334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Note that the locale is "C".  */
1335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("a", "a") == 0, 1);
1336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("a", "A") == 0, 2);
1337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("A", "a") == 0, 3);
1338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("a", "b") < 0, 4);
1339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("c", "b") > 0, 5);
1340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("abc", "AbC") == 0, 6);
1341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("0123456789", "0123456789") == 0, 7);
1342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("", "0123456789") < 0, 8);
1343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("AbC", "") > 0, 9);
1344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("AbC", "A") > 0, 10);
1345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("AbC", "Ab") > 0, 11);
1346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strcasecmp("AbC", "ab") > 0, 12);
1347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void
1350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_strncasecmp (void)
1351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  it = "strncasecmp";
1353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Note that the locale is "C".  */
1354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("a", "a", 5) == 0, 1);
1355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("a", "A", 5) == 0, 2);
1356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("A", "a", 5) == 0, 3);
1357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("a", "b", 5) < 0, 4);
1358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("c", "b", 5) > 0, 5);
1359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("abc", "AbC", 5) == 0, 6);
1360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("0123456789", "0123456789", 10) == 0, 7);
1361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("", "0123456789", 10) < 0, 8);
1362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("AbC", "", 5) > 0, 9);
1363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("AbC", "A", 5) > 0, 10);
1364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("AbC", "Ab", 5) > 0, 11);
1365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("AbC", "ab", 5) > 0, 12);
1366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("0123456789", "AbC", 0) == 0, 13);
1367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("AbC", "abc", 1) == 0, 14);
1368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("AbC", "abc", 2) == 0, 15);
1369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("AbC", "abc", 3) == 0, 16);
1370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("AbC", "abcd", 3) == 0, 17);
1371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("AbC", "abcd", 4) < 0, 18);
1372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("ADC", "abcd", 1) == 0, 19);
1373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  check(strncasecmp("ADC", "abcd", 2) > 0, 20);
1374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtest_strcasestr (void)
1378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  it = "strcasestr";
1380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr("abCd", "z") == NULL, 1);	/* Not found. */
1381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr("AbcD", "abX") == NULL, 2);	/* Dead end. */
1382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  (void) strcpy(one, "abCd");
1383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "c") == one+2, 3);	/* Basic test. */
1384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "Bc") == one+1, 4);	/* Multichar. */
1385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "d") == one+3, 5);	/* End of string. */
1386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "Cd") == one+2, 6);	/* Tail of string. */
1387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "aBc") == one, 7);	/* Beginning. */
1388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "aBcd") == one, 8);	/* Exact match. */
1389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "AbcDe") == NULL, 9);	/* Too long. */
1390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "dE") == NULL, 10);	/* Past end. */
1391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "") == one, 11);	/* Finding empty. */
1392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  (void) strcpy(one, "abAba");
1393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "Ba") == one+1, 12);	/* Finding first. */
1394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  (void) strcpy(one, "");
1395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "b") == NULL, 13);	/* Empty string. */
1396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "") == one, 14);	/* Empty in empty string. */
1397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  (void) strcpy(one, "BcbCa");
1398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "bCa") == one+2, 15);	/* False start. */
1399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  (void) strcpy(one, "bbBcaBbcA");
1400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  check(strcasestr(one, "bbCa") == one+1, 16);	/* With overlap. */
1401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint
1404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmain (void)
1405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
1406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int status;
1407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Test strcmp first because we use it to test other things.  */
1409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strcmp ();
1410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Test strcpy next because we need it to set up other tests.  */
1412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strcpy ();
1413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* A closely related function is stpcpy.  */
1415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_stpcpy ();
1416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined(__APPLE__)
1418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* stpncpy.  */
1419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_stpncpy ();
1420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strcat.  */
1423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strcat ();
1424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strncat.  */
1426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strncat ();
1427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strncmp.  */
1429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strncmp ();
1430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strncpy.  */
1432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strncpy ();
1433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strlen.  */
1435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strlen ();
1436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strchr.  */
1438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strchr ();
1439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# if !defined(__APPLE__)
1441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strchrnul.  */
1442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strchrnul ();
1443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# endif
1444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# if !defined(__APPLE__)
1446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* rawmemchr.  */
1447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_rawmemchr ();
1448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# endif
1449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* index - just like strchr.  */
1451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_index ();
1452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strrchr.  */
1454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strrchr ();
1455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# if !defined(__APPLE__)
1457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* memrchr.  */
1458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_memrchr ();
1459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# endif
1460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* rindex - just like strrchr.  */
1462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_rindex ();
1463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strpbrk - somewhat like strchr.  */
1465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strpbrk ();
1466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strstr - somewhat like strchr.  */
1468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strstr ();
1469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strspn.  */
1471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strspn ();
1472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strcspn.  */
1474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strcspn ();
1475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strtok - the hard one.  */
1477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strtok ();
1478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strtok_r.  */
1480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strtok_r ();
1481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strsep.  */
1483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strsep ();
1484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* memcmp.  */
1486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_memcmp ();
1487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* memchr.  */
1489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_memchr ();
1490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* memcpy - need not work for overlap.  */
1492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_memcpy ();
1493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* memmove - must work on overlap.  */
1495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_memmove ();
1496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# if !defined(__APPLE__)
1498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* mempcpy */
1499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_mempcpy ();
1500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# endif
1501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* memccpy.  */
1503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_memccpy ();
1504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* memset.  */
1506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_memset ();
1507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* bcopy.  */
1509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_bcopy ();
1510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* bzero.  */
1512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_bzero ();
1513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* bcmp - somewhat like memcmp.  */
1515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_bcmp ();
1516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined(__APPLE__)
1518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strndup.  */
1519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strndup ();
1520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
1521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strerror - VERY system-dependent.  */
1523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strerror ();
1524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strcasecmp.  Without locale dependencies.  */
1526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strcasecmp ();
1527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* strncasecmp.  Without locale dependencies.  */
1529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  test_strncasecmp ();
1530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  test_strcasestr ();
1532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (errors == 0)
1534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
1535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      status = EXIT_SUCCESS;
1536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //puts("No errors.");
1537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
1538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  else
1539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
1540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      status = EXIT_FAILURE;
1541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      printf("%d errors.\n", (int)errors);
1542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
1543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return status;
1545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1546